带模数的随机数发生器

时间:2014-01-16 17:43:44

标签: 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之间的确定值(包括0和9),并且通过绘制频率值(基本上是array值),结果图是概率密度函数。

只是为了让问题完整,这就是我在array中得到的结果。

214765115
214745521个
214749449个
214749304个
214747088个
214733986个
214745858个
214743477个
214760340个
214743509

3 个答案:

答案 0 :(得分:3)

随着模数的值增加,偏差将变大,随着最大随机数增加,偏差将变小。在这种情况下,10与最大的随机数相比非常小,因此偏差几乎是无法估量的。

如果您想查看更好的示例,请使用较少的随机数返回的位数。

int random_value = random() & 0xfff;
array[random_value % 10]++;

答案 1 :(得分:2)

例如,假设randomunsigned 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