【问题标题】:Shuffle sort - Fisher Yates, why cant I find random number between 0 and N-1?随机排序 - Fisher Yates,为什么我找不到 0 和 N-1 之间的随机数?
【发布时间】:2017-02-09 22:51:25
【问题描述】:

在学习 Shuffle 排序时,我学习了 Fisher Yates 解决方案。它循环 0 到数组长度,并在 0(含)和循环索引(含)和 NOT 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);

    }
}

StdRandom.uniform(i+1) 返回返回 0 到 i(均包含)之间的随机数

【问题讨论】:

  • 如果您告诉我们这是什么语言(显然是一些 C 变体,但是是哪个?),帮助会容易得多。
  • 嗯...@LeeDanielCrocker 那是 Java

标签: sorting random shuffle


【解决方案1】:

这是因为您无法通过在 0 到 n-1 之间选择 r 的方法以相等的概率生成每个序列。

示例: 考虑集合 {a,b,c} 的 n=3 总可能结果 = 3! 现在考虑完美的随机生成器,它可能生成的交换结果,其对应的打乱集为->

  1. 0 1 2 {a,b,c}
  2. 0 2 1 {a,b,c}
  3. 1 0 2 {a,b,c}
  4. 1 2 0 {a,c,b}
  5. 2 0 1 {b,a,c}
  6. 2 1 0 {a,b,c}

显然没有涵盖所有结果,Fisher Yates 的实际实施并非如此。

【讨论】:

    【解决方案2】:

    如果您只选择从 0 到 N-1,那么您永远不能选择数组中的最后一个数字。因此,它不是完全随机的。

    您可以预测,至少最后一个数字肯定是不合适的。

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

    【讨论】:

    • 好吧,我的错。我实际上想知道,如果我使用 0 到 N 之间的随机数(包括两者),它仍然不被认为是完全随机的(算法课程 - coursera)。你能帮我理解一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2021-08-25
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多