I am trying to implement a shuffled deck of cards in Javascript, but I am running into behavior I am having a hard time understanding.
Here is my code. For conciseness, this deck contains only cards with faces 1-5 and only two suits:
function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
function getDeck() {
let values = Array(5).fill().map((element, index) => index + 1);
let suits = ['H', 'D'];
let deck = new Array();
values.forEach(function(value) {
suits.forEach(function(suit) {
let card = {
'value': value,
'suit': suit
}
deck.push(card);
})
})
return deck
}
var deck = getDeck();
console.log(deck);
shuffleArray(deck);
console.log(deck);
I took the shuffle in place code from this answer
I would expect for the first log statement to show an unshuffled deck and the second log statement to show a shuffled deck. Instead, they both show identically shuffled decks! It's as if the randomization is reaching backwards in time!
To make matters worse, when I was first trying to code a minimal example, I didn't bother with values and suits and tried only to shuffle a small array, but in that case, it worked exactly as expected, only deepening my confusion...
function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
function getDeck() {
let deck = [1, 2, 3, 4, 5];
return deck;
}
var deck = getDeck();
console.log(deck);
shuffleArray(deck);
console.log(deck);
In that case, the output is
What's going on? Why does the simple case work but the more complex case not seem to? What about timing or scoping am I misunderstanding?