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

world_broken 2010-09-26 10:09:39
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,没有作用。高手帮忙分析下原因
...全文
171 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
guoguan1234567 2012-03-09
  • 打赏
  • 举报
回复
需要的随机程序1微秒左右产生一个随机数。要利用它产生大量的随机数。该如何实现?听说计算机程序产生的随机数,产生随机数的速度和产生随机数的总量都有限的,是吗?

那么,世界上哪一种随机数产生算法, 产生随机数的质量最高,同时产生随机数的速度最快,同时产生随机数的总量是最大的?
zx057x 2010-11-06
  • 打赏
  • 举报
回复
不要告诉楼主这个2B,他的脑子出生的时候被夹坏了!
world_broken 2010-09-28
  • 打赏
  • 举报
回复
我 vc6+xpsp2,问题其实早没了,变通一下,用两个Rand相乘再% xRnd.我早也估计可能是这问题,但具体细节却不知道,结贴。
ForestDB 2010-09-27
  • 打赏
  • 举报
回复
个人估计:rand的随机特性是有限的,当运行过一段时间后,出来的数据就是相同的了,如果是这种情况,mRnd得不到++(根据已有的代码的逻辑),然后就死循环了。
要确认其实很简单,把a的值printf出来,在if语句内也加printf。

另外LZ是什么平台,我这里的RAND_MAX为2147483647。
FancyMouse 2010-09-26
  • 打赏
  • 举报
回复
>修改过RAND_MAX,没有作用。
RAND_MAX不是给乃修改的。它是告诉乃CRT的rand()产生的值是0到RAND_MAX之间,但并不是说rand()的值取决于RAND_MAX。所以就算修改RAND_MAX,以m$的那个CRT,照样是产生在0~32767之间。一旦xRnd>=32768,那个不等式恒成立,当然死循环了。
world_broken 2010-09-26
  • 打赏
  • 举报
回复
但是为何32766 最后得到的却是32765

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧