今天因为要用到32为的随机数测试了一个这样的程序,其中RAND_MAX查了一下是0X7FFF,用rand()组合的方式写成这样
int Rand()
{
return (rand()&0x3)<<30|(rand()<<15)|rand();
}
int main()
{
for(int i=0;i<10;i++)
{
ll cnt=0;
while(1)
if(Rand()==0)break;
else ++cnt;
printf("%lld\n",cnt);
}
}
测试结果非常的出人意料,
相信这个2147483647 大家都很熟悉的,这说明rand()的底层实现是存在循环节的,究其原因个人猜测很可能是在底层实现的时候使用了int型的数据进行实现,而且没有带符号位,其结果就是随机数的输出形成了一个大小为2^31的数表,对于要生成2^15以内的随机数,这张表的大小是足够的,但是对于生成2^15(实际上是2^15.5)以上的随机数,这张表不能保证其生成数据的随机性,因此,当需要十五位以上的随机数时应该选取其他的方法,而不能通过rand()