public static void shuffle(Object[] a) {
int N = a.length;
for (int i = 0; i < N; i++) {
int r = StdRandom.uniform(i + 1);
exchange( a, i , r)
}
}
上面是用 java 编码的 StdRandom 类的方法。我想知道为什么 stdRandom.uniform( i + 1) 它在 0 和 i 之间,而不是在 0 和 (N - 1) 之间。
最佳答案
洗牌算法的工作原理就像您戴着帽子洗牌一样。将所有卡片松松地扔进帽子里。随机抽出一张牌放在位置 0,然后再抽出一张牌放在位置 1,以此类推,直到帽子空了,所有位置都填满了。
在填充 i
的算法中,数组的其余部分(位置 i+1、i+2、... N-1)是帽子。 交换
正在从帽子中随机取出一个元素并将其放置在需要的地方。 位于位置i
的项目向上移动,以便它仍然在帽子中。它在帽子中的位置并不重要,因为下一个随机数将以相同的概率选择所有帽子位置。
希望这个直观的解释有意义......
关于java - stdrandom shuffle 方法的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22015735/