一、最朴素的方式
首先想到的就是time.h(C++中是ctime)中的time(NULL)/time(0)作种子,写法也就是下面这样:
#include <ctime>
using namespace std;
int main() {
srand(time(NULL));
int n1 = rand(); //生成任意0~RAND_MAX(32767)之间的随机数
int n2 = rand() % 3; //生成0~2的随机数
int n3 = rand() % 3 + 1; //生成1~3的随机数
return 0;
}
二、高性能随机数
可以发现上面的随机数范围只在0~32767之间,如果我们需要更大一点的随机数,显然上面那种方式是不行的。这时候需要使用到random库中的mt19937,高性能随机数。
mt
是因为这个伪随机数产生器基于Mersenne Twister
算法。19937
是因为产生随的机数的周期(产生不重复随机数的个数)长,可达到2^19937-1。
产生随机数的方法有下面几种:
#include <iostream>
#include <random>
#include <ctime>
using namespace std;
int main() {
//以时间作种子
mt19937 rd1(time(NULL));
//std::random_device是均匀分布整数随机数生成器,通常用于播种
mt19937 rd2(random_device{}());
cout << rd1() << " " << rd2() << endl;
//normal_distribution是正态分布,两个参数是均值和方差
normal_distribution<double> nd(5, 2);
//正态随机,分布还有很多种,参见文章链接
for(int i = 0; i < 5; i++) {
cout << nd(rd2) << endl;
}
//如果想规定范围,我们可以使用均匀分布
uniform_int_distribution<int> dis(1, 10000);
for(int i = 0; i < 5; i++) {
cout << dis(rd2) << endl;
}
return 0;
}
各种分布链接:伪随机数生成