用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
的情况,如此类推。
<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
的情况,如此类推。
相关文章推荐
- 用C语言的rand()和srand()产生伪随机数的方法总结
- 用rand()和srand()产生伪随机数的方法总结
- 用rand()和srand()产生伪随机数的方法总结
- 用rand()和srand()产生伪随机数的方法总结
- 用C语言的rand()和srand()产生伪随机数的方法总结
- 用C语言的rand()和srand()产生伪随机数的方法总结
- 用rand()和srand()产生伪随机数的方法总结
- 用C语言的rand()和srand()产生伪随机数的方法总结
- 用rand()和srand()产生伪随机数的方法总结
- 用C语言的rand()和srand()产生伪随机数的方法总结
- [转]用C语言的rand()和srand()产生伪随机数的方法总结
- 用rand()和srand()产生伪随机数的方法总结 (转载)
- rand()和srand()产生伪随机数的方法总结(转)
- 用rand()和srand()产生伪随机数的方法总结
- C语言中rand()和srand()产生伪随机数的方法总结 [转]
- 用rand()和srand()产生伪随机数的方法总结 (转贴)
- 用C语言的rand()和srand()产生伪随机数的方法总结
- 用rand()和srand()产生伪随机数的方法总结
- 用rand()和srand()产生伪随机数的方法总结
- 实习的这段日子——用C语言的rand()和srand()产生伪随机数的方法总结