C++梅森選擇算法生成隨機數(mersenne_twister_engine)詳解


mersenne_twister_engine 類模板實現了梅森選擇算法,它被這樣叫是因為周期長度是一個梅森素數。

梅森素數是 2n-1 形式的素數,因此 7 和 127 是梅森素數;當然,用在這個算法中的梅森素數更大。這個引擎的應用非常廣泛,因為它可以生成非常高質量的序列,但存在速度相對較慢的缺點。這個算法很復雜並且包含很多的參數,因此在此不作解釋。

梅森素數算法實例

對於定義具體生成器的 mersenne_twister_engine 的實例有兩個類型別名。mtl9937 生成隨機的無符號 32 位整數,mtl9937_64 生成無符號的 64 位整數。mtl9937 隨機數生成器的周期長度為 219937-1,它因此得名。

可以用和其他生成相同的方式使用它們:

std::random_device rd;
std::mtl9937_64 rng {rd()}; // Generates random 64-bit integers
std::uniform_real_distribution<long double> dist {-5.OL, 5.OL};
for(size_t i {}; i < 8; ++i)
    std::cout << std::setw(5)<< dist(rng)<<" "; //-2.57481 3.0546 -1.6438 2.14798 -3.84095 0.973843 -2.98971 -2.1067

  

 1 #include <random>
 2 
 3 
 4 using namespace std;
 5 
 6 class CRandom {
 7     mt19937 r_;   //梅森選擇算法生成隨機數
 8     uniform_int_distribution<DWORD>    dw_;
 9 public:
10     CRandom() {
11         r_.seed(random_device()());
12     }
13     DWORD dwValue() { return dw_(r_); }
14 };
15 
16 static CRandom g_rand;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM