为什么条件rand()%3每次都近似为真?兰德是REALY随机不是吗?
答案 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 );
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.如果基于种子准时,从而制作一个“随机的“结果。 希望这会有所帮助。