Fisher–Yates 在 Javascript 中随机播放
Fisher–Yates Shuffle in Javascript
刚接触 JS,目前正在大学学习。对于我当前的 JS 项目,我正在构建一个存储卡游戏。我开始思考如何随机洗牌,我接近了 Fisher–Yates Shuffle 算法的作用——this page 上的第二个程序。但是,我不明白 [0] 在 splice 方法之后到底做了什么。难道是什么shifts/compacts数组?如果是的话,我找不到其他的 examples/documentations 了。
function shuffle(array) {
var copy = [], n = array.length, i;
// While there remain elements to shuffle…
while (n) {
// Pick a remaining element…
i = Math.floor(Math.random() * n--);
// And move it to the new array.
copy.push(array.splice(i, 1)[0]);
}
return copy;
}
array.splice(i, 1)
删除 array
的第 i
个元素,并将其作为单值数组 return 保存(就像 array.splice(i, 2)
将第 i
个和第 i+1
个元素和 return 它们剪掉为一个二元数组)。然后 [0]
,简单的索引操作,从该数组中选择单个元素(因为我们不需要数组);然后使用 copy.push
.
将此单个元素添加到 copy
更熟悉的索引操作用法:
array = [4, 7, 2, 10];
array[0]
// => 4
array[1]
// => 7
array = [18];
array[0]
// => 18
array.splice()
returns 一个数组,但是在洗牌时您想从未知位置随机拿一张牌并将其放入新数组(洗牌后的一张)中。现在要注意的是,您不想通过 copy.push(array.splice(i, 1)
再次添加类似的数组,因为这会将整个返回的数组添加到复制数组中,并且随机播放的随机性会降低,这反过来会导致依赖结果你的游戏,因为数组将与最后一个相似(~),只是翻转了几位。将 [0]
添加到 array.splice(i, 1)
可确保您仅从一次返回的整个结果数组中复制一个元素,从而产生更大的随机性。
刚接触 JS,目前正在大学学习。对于我当前的 JS 项目,我正在构建一个存储卡游戏。我开始思考如何随机洗牌,我接近了 Fisher–Yates Shuffle 算法的作用——this page 上的第二个程序。但是,我不明白 [0] 在 splice 方法之后到底做了什么。难道是什么shifts/compacts数组?如果是的话,我找不到其他的 examples/documentations 了。
function shuffle(array) {
var copy = [], n = array.length, i;
// While there remain elements to shuffle…
while (n) {
// Pick a remaining element…
i = Math.floor(Math.random() * n--);
// And move it to the new array.
copy.push(array.splice(i, 1)[0]);
}
return copy;
}
array.splice(i, 1)
删除 array
的第 i
个元素,并将其作为单值数组 return 保存(就像 array.splice(i, 2)
将第 i
个和第 i+1
个元素和 return 它们剪掉为一个二元数组)。然后 [0]
,简单的索引操作,从该数组中选择单个元素(因为我们不需要数组);然后使用 copy.push
.
copy
更熟悉的索引操作用法:
array = [4, 7, 2, 10];
array[0]
// => 4
array[1]
// => 7
array = [18];
array[0]
// => 18
array.splice()
returns 一个数组,但是在洗牌时您想从未知位置随机拿一张牌并将其放入新数组(洗牌后的一张)中。现在要注意的是,您不想通过 copy.push(array.splice(i, 1)
再次添加类似的数组,因为这会将整个返回的数组添加到复制数组中,并且随机播放的随机性会降低,这反过来会导致依赖结果你的游戏,因为数组将与最后一个相似(~),只是翻转了几位。将 [0]
添加到 array.splice(i, 1)
可确保您仅从一次返回的整个结果数组中复制一个元素,从而产生更大的随机性。