首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有关c++的随机数发生器。该死的32765解决方法

2012-03-26 
有关c++的随机数发生器。该死的32765C/C++ codeint mRnd0srand((unsigned) time(NULL))//难道是这句有问

有关c++的随机数发生器。该死的32765

C/C++ code
int mRnd=0;                srand((unsigned) time(NULL));//难道是这句有问题吗?        while(mRnd<xRnd)//一旦xRnd超过32765太多,程序便会立即卡死,cpu资源耗尽。        {               uint a=uint(double(rand()/(RAND_MAX-0.0)*xALL));//xALL为myarr大小,超过1000000                            if(myarr[a].yfill==0)//yfill为标志位                {        uint b=a%22;                        myarr[a].ter[b]=myarr[a].yfill=1;//程序根据结构体数组myarr中的ter[x]==1来统计最后的随机结果,经测试,xRnd>32765的话,那么统计结果固定是32765。???为什么                        ++mRnd;                }        }    

  问题是,xRnd<=32765 ,甚至稍大,程序都可以瞬间完成,但超过较多比如xRnd=70000的时候就会出现卡死的问题,修改过RAND_MAX,没有作用。高手帮忙分析下原因

[解决办法]
>修改过RAND_MAX,没有作用。
RAND_MAX不是给乃修改的。它是告诉乃CRT的rand()产生的值是0到RAND_MAX之间,但并不是说rand()的值取决于RAND_MAX。所以就算修改RAND_MAX,以m$的那个CRT,照样是产生在0~32767之间。一旦xRnd>=32768,那个不等式恒成立,当然死循环了。
[解决办法]
个人估计:rand的随机特性是有限的,当运行过一段时间后,出来的数据就是相同的了,如果是这种情况,mRnd得不到++(根据已有的代码的逻辑),然后就死循环了。
要确认其实很简单,把a的值printf出来,在if语句内也加printf。

另外LZ是什么平台,我这里的RAND_MAX为2147483647。

热点排行