产生随机数在程序中很有用,这篇文章简单介绍一下产生随机数的方法。
伪随机数
使用标准库<cstdlib>中的rand()函数产生随机数。
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
for (int i = ; i < ; i++) cout << rand()% << endl;//pesudo radom
return ;
}
表面上看,这段程序会产生三个随机数,但一个有趣的事情是,每次程序运行时产生的数据都是相同的。
我每次运行的结果都如下:
可以看出,rand()函数并不会产生一个真正的随机数。
要产生真正的随机数,需要了解time函数。
time函数
<ctime>中的time函数可以返回一个时间。函数声明如下
time_t time(
time_t *timer
);
参数timer是一个指针,指向时间的存储位置。使用时参数可以为0。如果使用其他整数,比如1,会产生无法从int转换成timme_t的错误。
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
cout << time()<<endl;
return ;
}
对于time函数的返回值,一把理解应该是当前的时间,但事实运行结果却并不如所想。
事实上,这个结果便是当前时间,只是表示方法有所不同。这个值是从1970年1月1日午夜到现在的秒数。
真正的随机数
<cstdlib>中产生用于真正随机数的函数srand()。函数接受一个参数作为seed,用于控制rand()函数的算法。相同的seed会使rand()产生相同的结果。
所以,若要产生真正的随机数,可以使用时间作为seed,这样每次都会产生真正的随机数了。
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
srand(time());
for (int i = ; i < ; i++) cout << rand() << endl;//truly random
return ;
}
这样,在使用了stan()之后,rand便可产生真正的随机数了。
控制随机数的范围
可以使用模运算来控制随机数的范围。下面代码产生了[0,10)范围的随机数。
rand()%;
一个例子,展示了这篇文章提及的函数。
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
cout << time()<<endl;//返回一个秒数
for (int i = ; i < ; i++) cout << rand() << endl;//pesudo radom
srand(time());
for (int i = ; i < ; i++) cout << rand()% << endl;//truly random
return ;
}
首先输出一个秒数。
接着输出了3个随机数,这三个随机数每次都是相同的。
使用时间作为seed,rand()函数的返回值。
产生3个真随机数,其范围是[0,10)。