我用 C++ 随机数生成器代码尝试了一个小实验。我把代码贴出来给大家看看。
unsigned int array[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
unsigned int rand_seed = 4567;
int loop = 0;
srandom(rand_seed);
while (loop < 2147483647)
{
array[random() % 10]++;
loop++;
}
for (int i = 0; i < 10; i++)
{
cout << array[i] << endl;
}
代码很简单,这里就不多解释了。我了解到模运算会导致一个小的 bais,在这种情况下,0 的出现次数应该高于其他值,因为 0 本身会被计算在内,并且每当 10 出现时。但是当我显示我的 array
的内容时,0 到 9(含)之间的所有数字的值几乎相同。
谁能告诉我这种偏见到底是对还是错?如果是的话,模运算确实会引入偏差,为什么我看不到呢?
用数学术语来说,我可以说我的随机变量 X 可以有 0 到 9(含)之间的确定值,并且通过绘制频率值(本质上是 array
值),结果图是概率密度函数。
这里只是为了使问题完整,这是我在 array
中得到的结果。
214765115
214745521
214749449
214749304
214747088
214733986
214745858
214743477
214760340
214743509
最佳答案
bias 会随着模值的增加而变大,随着最大随机数的增加而变小。在这种情况下,10 与最大随机数相比非常小,因此偏差几乎无法估量。
如果您想看到更好的示例,请使用更少的随机数返回位。
int random_value = random() & 0xfff;
array[random_value % 10]++;
关于c++ - 带模数的随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21169057/