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