c++中生成随机数时的种子问题

[复制链接]
查看11 | 回复1 | 2010-3-20 19:00:09 | 显示全部楼层 |阅读模式
srand(time(NULL));只需要在main()函数中调用一次,如果每次取随机数之前都调用srand()函数,那么返回的随机数顺序是一样的.
回复

使用道具 举报

千问 | 2010-3-20 19:00:09 | 显示全部楼层
// 其实一次两次都是可以的。你这个程序两次都一样,因为两次srand()的时间太接近了,计算机速度这么快,你两次srand()的时间压根就一样,得到结果是一样的。如果你在中间sleep(1000)一下,结果自然就不一样了。// 给个例子你运行下。#include #include #include using namespace std;int main(){ int a; int b; srand(time(0)); for(int i=0;i//…srand((unsigned)time(0));for(int i=0;i<10;i++){ran_num=ra nd() % 6;cout<<ran_num<<" ";}第一次运行时输出:0 1 5 4 5 0 2 3 4 2第二次:3 2 3 0 3 5 5 2 2 3总之,每次运行结果将不一样,因为每次启动程序的时刻都不同(间隔须大于1 秒?见下)。关于time_t time(0):time_t 被定义为长整型,它返回从1970 年1 月1 日零时零分零秒到目前为止所经过的时间,单位为秒。比如假设输出:cout<<time(0);值约为1169174701,约等于37(年)乘365(天)乘24(小时)乘3600(秒)(月日没算)。另外,关于ran_num = rand() % 6,将rand()的返回值与6 求模是必须的,这样才能确保目的随机数落在[0,6) 之间,否则rand()的返回值本身可能是很巨大的。一个通用的公式是:要取得[a,b) 之间的随机整数,使用(rand() % (b-a))+ a (结果值将含a 不含b) 。在a 为0 的情况下,简写为rand() % b。最后,关于伪随机浮点数:用rand() / double(RAND_MAX)可以取得0~1 之间的浮点数(注意,不同于整型时候的公式,是除以,不是求模) ,举例:double ran_numf=0.0;srand((unsigned)time(0));for(int i=0;i<10;i++){ran_numf = rand() / (double)(RAND_MAX);cout<<ran_numf<<" ";}运行结果为:0.716636,0.457725,…等10 个0~1 之间的浮点数,每次结果都不同。如果想取更大范围的随机浮点数,比如1~10,可以将rand() /(double)(RAND_MAX) 改为rand() /(double)(RAND_MAX/10)运行结果为:7.19362,6.45775,…等10 个1~10 之间的浮点数,每次结果都不同。至于100,1000 的情况,如此类推。以上不是伪随机浮点数最好的实现方法,不过可以将就着用用!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行