Sorting 洗牌排序-费舍尔·耶茨,为什么我找不到0和N-1之间的随机数?
在学习洗牌排序时,我学习了Fisher-Yates解决方案。它循环0到数组长度,并在0(包括)和循环索引(包括)之间找到一个随机数,而不是0和N-1。找到一个介于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);
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! 现在考虑完美随机生成器,它将生成的可能交换结果及其相应的洗牌集如下->
显然没有涵盖所有的结果,Fisher-Yates的实际实现将不会如此。如果您告诉我们这是什么语言(显然是一些C变体,但是哪种?)嗯…@LeeDanielCrocker这是Javaok,我的错。我实际上想知道,如果我使用0到N之间的随机数(包括0到N),它仍然不是完全随机的(算法课程-coursera)。你能帮我理解吗?