计算机生成随机数的方法是线性同余法,通过特定的算法生成一系列毫无规则的数字,让用户看起来好象是随机数,但本质上是伪随机数。
示例一:
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char** argv) {
cout<<"本机的最大随机数为:"<<RAND_MAX<<endl;
for(int i=0;i<5;++i)
{
cout<<rand()<<endl;
}
return 0;
}
RAND_MAX表示本机的最大随机整数,不同机器可能不同。然后用一个for循环生成五个随机数,如下所示:
但是,示例一有一个问题,就是每一次程序运行产生的随机数都是一样的,原因就是C++标准库在编写rand函数的时候采用的是线性同余法,算法一样的情况下结果自然相同。为了使每一次运行的结果都产生不一样的随机数,需要借用“随机种子”这一概念,如示例二所示。
示例二:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(int argc, char** argv) {
cout<<"本机的最大随机数为:"<<RAND_MAX<<endl; //输出本机最大的随机数
srand((int) time(NULL)); //随机种子,只能在第一次调用rand()函数之前使用一次 ,NULL是个宏定义的值,就是0
for(int i=0;i<5;++i)
{
cout<<rand()<<endl;
}
return 0;
}
两次不同时间的运行结果如下:
加上随机种子之后,程序生成的结果就不一样了。srand()函数每个程序只能使用一次,在第一次调用rand()函数之前使用,以获取当前时间(时间总是不一样的),它是通过时间来使得每一次产生的随机数都各不相同。如给srand()函数传递的参数是一个定值,比如srand(5),则多次运行程序后产生的随机数序列也是相同的。原因在于种子相同,产生的随机数也是相同的,因此想要什么类型的随机数序列,就应该仔细研究随机种子的取值规律。示例二中给srand()函数传递的参数为time(0)的返回值,它的功能是返回系统当前的时间。