说明
std::mt19937
是伪随机数产生器,用于产生高性能的随机数。 C++11
引入。
返回值为unsigned int
。
std::mt19937
接收一个unsigned int
数作为种子。所以可以如下定义:
std::mt19937 mt_rand(std::random_device{}());
std::mt19937 mt_rand(time(0));
std::mt19937 mt_rand(std::chrono::system_clock::now().time_since_epoch().count());
名称由来
A Mersenne Twister pseudo-random generator of 32-bit numbers with a state size of 19937 bits.
mt
是因为这个伪随机数产生器基于Mersenne Twister
算法。
19937
是因为产生随的机数的周期长,可达到2^19937-1。
头文件
#include <random>
例子:产生5个伪随机数
#include <iostream>
#include <random>
using namespace std;
int main()
{
std::mt19937 rng(std::random_device{}());
for (int i = 0; i < 5; i++) {
cout << rng() << endl;
}
return 0;
}
一种可能结果如下:
476574181
3603119624
1741191339
2689635839
2835258576
std::random_device
本身是均匀分布整数随机数生成器,通常仅用于播种
std::random_device rd;
std::mt19937 rng(rd());
通常一步写成std::mt19937 rng(std::random_device{}());
例子:使用特定分布的随机数
分布有很多种,如均匀分布、正态分布等,可参考(https://zh.cppreference.com/w/cpp/numeric/random)
产生特定分布的随机数,需要使用分布函数
产生正态分布的随机数的例子如下:
#include <iostream>
#include <random>
using namespace std;
int main()
{
std::mt19937 rng(std::random_device{}());
std::normal_distribution<double> nd(5, 2);
for (int i = 0; i < 5; i++) {
cout << nd(rng) << endl;
}
return 0;
}
正态接收两个参数:均值和标准差,这里分别输入5,2. 一种可能结果如下:
8.80156
5.78055
4.99761
7.6995
1.21933
参考
http://www.cplusplus.com/reference/random/mt19937/
https://www.cnblogs.com/egmkang/archive/2012/09/06/2673253.html
https://zh.cppreference.com/w/cpp/numeric/random