Skip to content

mt19937 伪随机数生成器

1. 算法简介

std::mt19937 是伪随机数产生器,用于产生高性能的随机数。C++ 11 引入,返回值为 unsigned int 。这个伪随机数产生器基于 Mersenne Twister 算法,其周期可达到 21993712^{19937}-1,其定义在 <random> 头文件中。

std::mt19937 接收一个 unsigned int 数作为种子,定义如下:

cpp
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());

其中 time() 是定义在 C 语言库 <time.h> 中的时间函数,返回当前秒数。

std::chrono::system_clock::now().time_since_epoch().count() 则是返回当前的纳秒数,但最后三位数永远是零,计算机不会计算比微秒更精确的时间。

2. 产生均匀的随机数

示例代码:

cpp
#include <iostream>
#include <random>
using namespace std;

int main() {
    mt19937 rng{random_device{}()};
    uniform_real_distribution<double> uni{0, 1};
    cout << uni(rng) << endl;
}

3. 常见分布

  • 均匀分布
    • uniform_int_distribution
    • uniform_real_distribution
  • 正态分布
    • normal_distribution
  • 伯努利分布
    • binomial_distribution