rand()的奇怪行为

时间:2010-12-29 17:06:33

标签: c random

为什么条件rand()%3每次都近似为真?兰德是REALY随机不是吗?

3 个答案:

答案 0 :(得分:3)

当然,你意识到即使是一枚公平的硬币也能连续给你十个头。可以分配给该组合。

一个公平的硬币会在许多试验中给出半个半头和半个尾巴,但不能保证在短时间内达到50/50。

您对物理世界的体验告诉您,您的结论是不正确的。 rand()也是如此。

答案 1 :(得分:1)

正如Linux manpage for rand()所说:

  

然而,在较旧的rand()实现以及不同系统上的当前实现中,低阶位比高阶位更不随机。当需要良好的随机性时,请勿在可移植的应用程序中使用此功能。

所以你可能想要使用不同的随机数发生器,或者拉高阶位(可能表现出更多的随机性)。

rand()的典型实现是linear congruential generator,它只不过是一个乘法,并添加了一些具有特殊属性(相对素数)的数字。例如,几个实现:

  • MSVC 2010 rand()

     return( ((ptd->_holdrand = ptd->_holdrand * 214013L
                + 2531011L) >> 16) & 0x7fff );
    
  • 来自IAR工作台的
  • rand()

     (x) * 1664525L + 1013904223L           
    

你会注意到MSVC 2010的rand()将结果向右移动,我假设帮助解决Linux联机帮助页中描述的关于低位比特中非随机性的问题。

但是,如果您想提高结果的随机性,可能需要考虑使用基于类似Mersenne twister之类的例程来实现互联网上的实现。

答案 2 :(得分:0)

我对此代码有同样的问题:

#include<iostream.h>
#include<stdlib.h>
int main()
{
    srand(NULL);       
    cout << rand() % 10 + 1;
}

运行10次后,我每次都得到1次。但我把种子改成了这样:

#include<iostream.h>
#include<stdlib.h>
//new include:
#include<time.h>
int main()
{
    srand(time(NULL));       
    cout << rand() % 10 + 1;
}

这是因为RANDOMIZER接受种子(srand()),它在第一个中恰好为空,然后运行一个给定的算法,给出输出1.如果基于种子准时,从而制作一个“随机的“结果。 希望这会有所帮助。