說明
std::mt19937是偽隨機數(shù)產(chǎn)生器,用于產(chǎn)生高性能的隨機數(shù)。 C++11引入。
返回值為unsigned int。
std::mt19937接收一個unsigned int數(shù)作為種子。所以可以如下定義:
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是因為這個偽隨機數(shù)產(chǎn)生器基于Mersenne Twister算法。
19937是因為產(chǎn)生隨的機數(shù)的周期長,可達到2^19937-1。
頭文件
#include <random>
例子:產(chǎn)生5個偽隨機數(shù)
#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;
}
一種可能結(jié)果如下:
476574181
3603119624
1741191339
2689635839
2835258576
std::random_device本身是均勻分布整數(shù)隨機數(shù)生成器,通常僅用于播種
std::random_device rd;
std::mt19937 rng(rd());
通常一步寫成std::mt19937 rng(std::random_device{}());
例子:使用特定分布的隨機數(shù)
分布有很多種,如均勻分布、正態(tài)分布等,可參考(https://zh.cppreference.com/w/cpp/numeric/random)
產(chǎn)生特定分布的隨機數(shù),需要使用分布函數(shù)
產(chǎn)生正態(tài)分布的隨機數(shù)的例子如下:
#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;
}
正態(tài)接收兩個參數(shù):均值和標準差,這里分別輸入5,2. 一種可能結(jié)果如下:
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