mt19937

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,b]之间均匀分布

std::random_device rd;   // 将用于为随机数引擎获得种子
std::mt19937 gen(rd());  // 以播种标准 mersenne_twister_engine
std::uniform_int_distribution<> dis(1, 6);
void solve() {
    for (int i = 1; i <= 5; i++)
        cout << dis(gen) << endl;
}

产生均匀分布在区间 [a,b)上的随机浮点值 x

std::random_device rd;  // 将用于获得随机数引擎的种子
std::mt19937 gen(rd()); // 以 rd() 播种的标准 mersenne_twister_engine
std::uniform_real_distribution<> dis(1, 2);
for (int n = 0; n < 10; ++n) {
    // 用 dis 变换 gen 生成的随机 unsigned int 为 [1, 2) 中的 double
    std::cout << dis(gen) << ' '; // 每次调用 dis(gen) 都生成新的随机 double
}

标准正态分布

std::random_device rd{};
std::mt19937 gen{rd()};

// 值最可能接近平均
// 标准差影响生成的值距离平均数的分散
std::normal_distribution<> d{5,2};

std::map<int, int> hist{};
for(int n=0; n<10000; ++n) {
    ++hist[std::round(d(gen))];
}
for(auto p : hist) {
    std::cout << std::setw(2) << p.first << ' ' << std::string(p.second/200, '*') << endl;
}

Last updated