我尝试了一个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之间的确定值(包括0和9),并且通过绘制频率值(基本上是array
值),结果图是概率密度函数。
只是为了让问题完整,这就是我在array
中得到的结果。
214765115
214745521个
214749449个
214749304个
214747088个
214733986个
214745858个
214743477个
214760340个
214743509
答案 0 :(得分:3)
随着模数的值增加,偏差将变大,随着最大随机数增加,偏差将变小。在这种情况下,10与最大的随机数相比非常小,因此偏差几乎是无法估量的。
如果您想查看更好的示例,请使用较少的随机数返回的位数。
int random_value = random() & 0xfff;
array[random_value % 10]++;
答案 1 :(得分:2)
例如,假设random
在unsigned char
[0; 255]
这样的值
现在,如果我们使用modulo % 10
,由于0, 1, 2, 3, 4, 5
,我们会再多[250; 255]
。
答案 2 :(得分:2)
这是一个简单的代码,在这里解释不多。我学会了模数 操作导致小bais,在这种情况下应该发生0 高于其他值,因为0本身被计算,每当10 发生。
不仅是10,而且每隔一个数字也会包裹在[0,9]之间,因为modulo是以10为除数。因此,这里有一个映射,从random()
返回的值(即假设[0,255],POSIX random()具有更宽的范围,但这个想法很重要)到域[0,9]。这引入了偏见。
在数学术语中,我可以说我的随机变量X可以确定 0到9之间的值(包括0和9),并绘制频率值 (基本上是数组值),结果图是概率 密度函数。
当然这是一个分布,但是在范围[0,9]上这不是均匀的,而是偏向左边。在我们的例子中,有n = 256种可能性,这里是概率密度函数
x f(x)
0 26/256
1 26/256
2 26/256
3 26/256
4 26/256
5 26/256
6 25/256
7 25/256
8 25/256
9 25/256
sum 1