Sorting 洗牌排序-费舍尔·耶茨,为什么我找不到0和N-1之间的随机数?

Sorting 洗牌排序-费舍尔·耶茨,为什么我找不到0和N-1之间的随机数?,sorting,random,shuffle,Sorting,Random,Shuffle,在学习洗牌排序时,我学习了Fisher-Yates解决方案。它循环0到数组长度,并在0(包括)和循环索引(包括)之间找到一个随机数,而不是0和N-1。找到一个介于0和N-1之间的随机数并不能给出一个随机解。但我找不到同样的原因 public static void sort(Comparable[] a){ for(int i = 0 ; i < a.length ; i++){ int r = StdRandom.uniform(i+1);

在学习洗牌排序时,我学习了Fisher-Yates解决方案。它循环0到数组长度,并在0(包括)和循环索引(包括)之间找到一个随机数,而不是0和N-1。找到一个介于0和N-1之间的随机数并不能给出一个随机解。但我找不到同样的原因

public static void sort(Comparable[] a){

    for(int i = 0 ; i < a.length ; i++){ 

        int r = StdRandom.uniform(i+1); 
        // why cant this be a.length

        exch(a, i, r);

    }
}
公共静态无效排序(可比[]a){
对于(inti=0;i

StdRandom.uniform(i+1)返回介于0和i(包括两者)之间的随机数

如果仅从0到N-1进行选择,则永远无法选择数组中的最后一个数字。因此它不是完全随机的

你可以预测,至少最后一个数字肯定不合适


我知道这并不意味着你可以预测整个序列,但它确实意味着系统中不存在完全随机性。

这是因为你不能用在0到n-1之间选择r的方法以相同的概率生成每个序列

例如: 对于集合{a,b,c},考虑n=3 总的可能结果=3! 现在考虑完美随机生成器,它将生成的可能交换结果及其相应的洗牌集如下->

  • 0112{a,b,c}
  • 021{a,b,c}
  • 102{a,b,c}
  • 120{a,c,b}
  • 2 0 1{b,a,c}
  • 2110{a,b,c}

  • 显然没有涵盖所有的结果,Fisher-Yates的实际实现将不会如此。

    如果您告诉我们这是什么语言(显然是一些C变体,但是哪种?)嗯…@LeeDanielCrocker这是Javaok,我的错。我实际上想知道,如果我使用0到N之间的随机数(包括0到N),它仍然不是完全随机的(算法课程-coursera)。你能帮我理解吗?