一. 伪随机数
在C++中要生成随机数,首先要include一个文件——<cstdlib>。cstdlib文件中包含与随机数生成有关的函数,最常见的是rand()函数,该函数可以返回一个一个随机数,简单用法如下:
#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
int rand_num=rand();
cout<<rand_num<<endl;
//system("pause");//在vscode上要显示cout的结果,需要加上这句
return 0;
}
如上简单代码中函数rand()返回了一个随机数给int变量rand_num,运行结果:
注意,函数rand()是不需要任何实参就可以返回一个随机数,但返回的随机数是基于数学公式在计算机内部生成的伪随机数,不是真正的随机数,因为每次运行程序所返回的随机数数组都是一样的排列,也就是说对于上述简单代码,无论运行多少次程序,结果都会返回给rand_num一个数41(不同的计算机数字可能会不同,但都不会变)。那么如何生成真随机数呢?
二. 真随机数
要生成真随机数,就得为随机数生成器确定随机数种子,利用种子的数(不同)来确定伪随机数序列中(不同的)起始位置,从而产生真随机数。这时需要用到函数srand(),代码如下:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(){
srand(static_cast<unsigned int>(time(0)));
int rand_num=rand();
cout<<rand_num<<endl;
//system("pause");//在vscode上要显示cout的结果,需要加上这句
return 0;
}
srand()需要传递一个unsinged int型的参数作为种子,在上述代码中time(0)返回一个基于当前计算机的日期和时间的数字(要使用这个函数,需要#include <ctime>),而static_cast<unsigned int>就可以把time(0)的返回值转换为unsigned int型。这样做的好处是因为时间是一直变化的,所有每次运行程序时,随机数生成器的种子就不同,就会产生不同的随机数(真随机数)。上述代码多次运行就会发现每次运行后,rand_num的值都会不一样。
第一次:
第二次: