c++ - 带模数的随机数生成器

标签 c++ math random statistics probability

我用 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/

相关文章:

java - 生成三维随机数空间的算法

javascript - 生成具有相关概率的随机字符串

c++ - 密码信息

c++ - (-2147483648> 0) 在 C++ 中返回 true?

c++ - cpp 和 C 中非法除以零异常

python - 如何在计算器中显示数字,在 Python 中使用 TKinter?

arrays - ILMath 函数在给定开始、结束和步长的情况下排列值?

matlab - 将 3d 坐标存储在点列表中 Matlab

c++ - 如果包含 map 的静态库与可执行和动态库链接,静态 map (变量)会被多次释放吗?

c - 考虑稀疏矩阵获取转置矩阵(可能与排序有关)