我正在阅读有关从 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/