【发布时间】:2023-01-15 10:53:05
【问题描述】:
我正在寻找一个函数,它不是简单地洗牌一个数组,而是洗牌而不在他之前所在的索引处留下任何元素。
我已经尝试过 Fisher-Yates 算法,但它并没有解决我的问题:
function shuffle(array) {
var m = array.length, t, i;
while (m) {
i = Math.floor(Math.random() * m--);
t = array[m];
array[m] = array[i];
array[i] = t;
}
}
测试时,我得到了 [0, 1, 2, 3, 4, 5] 之类的结果改组为 [5, 0, 3, 1, 4, 2]。但在这里,4 几乎“停留”在与之前相同的指数上。
例如,我正在寻找的函数会将 [0, 1, 2, 3, 4, 5] 随机化为 [4, 1, 5, 3, 2],其中没有元素与之前的索引相同
【问题讨论】:
-
2在您的第一个示例中没有移动吗?我不清楚为什么2是个问题?在您的第二个示例中,0发生了什么事?而不是1仍然和以前一样? -
如果“随机”不是您对“洗牌”的定义,那么您对“洗牌”的确切定义是什么?例如:简单地将每个元素向前移动一个索引(模长度)是否合格?
-
@NickParsons 是的,编辑了它,感谢您指出
-
@jsejcksn 理论上是合格的,但结果需要改变,我相信一段时间后它会重演
-
^“一段时间后它会重演“ @Ninjdai 任何算法最终都会重复:没有有限有序集合具有无限排列。您需要提供明确定义的期望才能获得令人满意的答案。
标签: javascript node.js arrays javascript-objects shuffle