【发布时间】:2016-08-17 07:05:02
【问题描述】:
我遇到了以下用于在 Javascript 中对数组进行洗牌的算法。它似乎与 Fisher-Yates shuffle 的不同之处在于可用“交换”的范围随着 for 循环计数器的增加而增加。这似乎与 Fisher-Yates 版本的行为方式相反。我很好奇这是否是一个有效的算法。是伪装的费雪耶茨吗?有偏见吗?
如果有人可以提供一些代码来测试它生成的排列频率,那将是一个奖励。
<script>
var shuffle = function (myArray) {
var random = 0;
var temp = 0;
console.log(myArray);
for (i = 1; i < myArray.length; i++) {
random = Math.round(Math.random() * i);
console.log(random + '\n');
temp = myArray[i];
myArray[i] = myArray[random];
myArray[random] = temp;
console.log(myArray);
}
return myArray;
}
var arr = [1, 2, 3, 4];
shuffle(arr);
</script>
【问题讨论】:
-
你有没有测试过它是否有任何可观察到的偏差?
-
那个随机的缩进,虽然...
-
is this a valid algorithm- 是的,它不会抛出任何错误。 -
不确定如何编写程序来测试大量试验的所有排列。乍一看,结果“看起来”很公平,但我想要更多证据 - 阅读了关于洗牌的常见幼稚解决方案的严重偏见。
-
使用
Math.floor()而不是Math.round(),除此之外,算法很好而且很常见。 edit: 我知道的实现总是向后迭代;无法判断这是否有显着差异。
标签: javascript algorithm shuffle