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)
随机播放算法就像你用帽子洗牌一样。将所有卡片松散地扔进帽子里。抽出一张随机牌并将其放在0位置,然后将其放在位置1等处,直到帽子为空并且所有位置都被填满。
在填充i
的算法中,数组的其余部分(位置i + 1,i + 2,... N-1)就是帽子。 exchange
正在从该帽子中取出一个随机物品并将其放置在需要的位置。位于i
的 的项目向上移动,以便它仍然在帽子中。它位于帽子中的位置并不重要,因为下一个随机数将以相同的概率选择所有帽子位置。
希望这种直观的解释有意义......
答案 1 :(得分:0)
简短的回答是0到N-1之间不会产生均匀的随机分布。
在设计随机播放时,您需要确保所有可能的值放置的随机组合具有相同的可能性,0到N-1使得某些结果比其他结果更有可能。
有关更详细的讨论,请参阅Shuffling algorithm analysis。