您的位置:首页 > 其它

用rand()和srand()产生伪随机数的方法总结

2010-07-07 23:39 232 查看
标准库
<cstdlib>

(被包含于
<iostream>

中)提供两个帮助生成伪随机数的函数:



函数一:
int rand(void)




srand (seed)

中指定的
seed

开始,返回一个
[seed, RAND_MAX


0x7fff


)

间的随机整数。



函数二:
void srand(unsigned seed)



参数
seed


rand()

的种子,用来初始化
rand()

的起始值。



可以认为
rand()

在每次被调用的时候,它会查看:

1



如果用户在此之前调用过
srand(seed)

,给
seed

指定了一个值,那么它会自动调用

srand(seed)

一次来初始化它的起始值。

2



如果用户在此之前没有调用过
srand(seed)

,它会自动调用
srand(1)

一次。



根据上面的第一点我们可以得出:

1



如果希望
rand

()在每次程序运行时产生的值都不一样,必须给
srand(seed)

中的
seed

一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。

2



否则,如果给
seed

指定的是一个定值,那么每次程序运行时
rand

()产生的值都会一样,虽然这个值会是
[seed, RAND_MAX


0x7fff


)

之间的一个随机取得的值。

3



如果在调用
rand()

之前没有调用过
srand(seed)

,效果将和调用了
srand(1)

再调用
rand()

一样(
1

也是一个定值)。



举几个例子,假设我们要取得
0


6

之间的随机整数(不含
6

本身):



例一,不指定
seed



for(int i=0;i<10;i++){

ran_num=rand() % 6;

cout<<ran_num<<" ";

}

每次运行都将输出:
5 5 4 4 5 4 0 0 4 2



例二,指定
seed

为定值
1



srand(1);

for(int i=0;i<10;i++){

ran_num=rand() % 6;

cout<<ran_num<<" ";

}

每次运行都将输出:
5 5 4 4 5 4 0 0 4 2

跟例子一的结果完全一样。



例三,指定
seed

为定值
6



srand(6);

for(int i=0;i<10;i++){

ran_num=rand() % 6;

cout<<ran_num<<" ";

}

每次运行都将输出:
4 1 5 1 4 3 4 4 2 2

随机值也是在
[0,6

)之间,随得的值跟
srand(1)

不同,但是每次运行的结果都相同。



例四,指定
seed

为当前系统流逝了的时间(单位为秒):
time_t time(0)



#include <ctime>

//…

srand((unsigned)time(0));

for(int i=0;i<10;i++){

ran_num=rand() % 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

的情况,如此类推。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: