我知道肯定有更好的方法来改变,更糟糕的是洗牌的方法,但我试图弄清楚这个功能是如何运作的。如此陈词滥调,如果你不能解释为三岁,你就不会理解它"。这个功能对我来说很难向三岁的孩子解释。我写了一些关于我认为函数的作用的评论,但是有人可以详细描述这个函数的每个步骤在arr [i]的值设置为temp之后最重要的。
var shuffle = function(array) {
//creates a copy of the array
array = array.slice()
//iterates through the array
for (var i = 0; i < array.length; i++){
//generates a random index no longer than the length of the array
var j = Math.floor(Math.random() * array.length);
//stores the iterated values of array[i]
var temp = array[i];
//confusing part!
array[i] = array[j];
//confusing part!
array[j] = temp;
}
//returns the newly modified copy of the original array
return array;
};
答案 0 :(得分:0)
这三行可用于交换array[i]
和array[j]
之间的值。
array[i]
的商店值temp
。
array[j]
的商店值array[i]
。现在,array[i]
的值为array[j]
。
将值从temp
恢复为array[j]
。现在,array[j]
的实际值为array[i]
。
完成此步骤后,array[i]
的值将位于array[j]
,array[j]
的值将位于array[i]
。
您实施的算法与Fisher-Yates shuffle的版本略有不同。
基本上,在每次迭代时,都会选择一个随机数(严格小于数组大小的长度)。然后,将交换当前索引(array[i]
)处的元素和与随机选择的索引(array[j]
)对应的元素。
答案 1 :(得分:0)
标记为“令人困惑”的部分只是用随机选择的元素交换当前数组元素的值。它将当前值放在临时变量中,用random元素替换当前元素,然后用随机元素替换随机元素。