algorithm - 了解均匀随机数生成

标签 algorithm random

我正在阅读有关从 rand5() 生成 rand7() 的问题,但我似乎仍然不太理解它。显示了建议的解决方案 here :

        int i;
        do
        {
          i = 5 * (rand5() - 1) + rand5();  // i is now uniformly random between 1 and 25
        } while(i > 21);
        // i is now uniformly random between 1 and 21
        return i % 7 + 1;  // result is now uniformly random between 1 and 7

我理解这种方法,但我不明白为什么范围必须从 1 到 21。我的解决方案是这样的:

        int i;
        do
        {     
          i = (rand5()-1) + rand5();  // i is now uniformly random between 1 and 9
        } while(i > 7); 
        // i is now uniformly random between 0 and 6
        return i+1;

我无法说服自己上述方法行不通。你们能给我一个比其他人出现更多的数字的例子,使我的方法不统一吗?为什么需要 5 的乘数?

最佳答案

当您将两个均匀分布的随机数相加时,结果不再均匀分布。考虑结果表:

    1  2  3  4  5
  ---------------
1 | 1  2  3  4  5
2 | 2  3  4  5  6
3 | 3  4  5  6  7
4 | 4  5  6  7  8
5 | 5  6  7  8  9

统计表中5的个数,统计1和9的个数,问题应该很明显。

通过将一个随机数乘以范围并加上第二个,您可以保持每个数字的贡献独立。恰好有 25 种不同的结果,每种都有 1/25 的概率。

关于algorithm - 了解均匀随机数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26149083/

相关文章:

javascript - 让 JavaScript 随机报价生成器每天只生成一个报价

algorithm - 修改均匀随机数生成器的范围

arrays - 在字符串数组中查找特定字符/字母的算法?

python - 构建组织结构图

algorithm - 有没有办法知道 parseFloat 或 Float 数字精度何时会出错?

python - 深度学习中哪些算法可以验证列到矩阵的关系

javascript - 了解 "global"正则表达式

python - 如何根据自定义概率密度函数(Python)生成随机数?

ASP.net 列表随机排序

c++ - 英特尔 DRNG 只给出 4 个字节的数据而不是 8 个