stdrandom shuffle方法如何工作

时间:2014-02-25 13:32:40

标签: java sorting shuffle

 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)之间。

2 个答案:

答案 0 :(得分:1)

随机播放算法就像你用帽子洗牌一样。将所有卡片松散地扔进帽子里。抽出一张随机牌并将其放在0位置,然后将其放在位置1等处,直到帽子为空并且所有位置都被填满。

在填充i的算法中,数组的其余部分(位置i + 1,i + 2,... N-1)就是帽子。 exchange正在从该帽子中取出一个随机物品并将其放置在需要的位置。位于i 的项目向上移动,以便它仍然在帽子中。它位于帽子中的位置并不重要,因为下一个随机数将以相同的概率选择所有帽子位置。

希望这种直观的解释有意义......

答案 1 :(得分:0)

简短的回答是0到N-1之间不会产生均匀的随机分布。

在设计随机播放时,您需要确保所有可能的值放置的随机组合具有相同的可能性,0到N-1使得某些结果比其他结果更有可能。

有关更详细的讨论,请参阅Shuffling algorithm analysis