C++ STL mt19937 使用說明

說明

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容