一、简介
在C语言
中常使用srand()
+random()
的方式生成随机数,该方式并不是一个很好的随据说生成方法,一方面是因为其生成的随机数质量较低,另一方面其随机数范围也有所限制。在C++11
中推荐使用随机数引擎的方式生成随机数。
如何高效得生成高质量得随机数(甚至需要满足指定分布)是一个复杂的问题,本文只给出C++11
中常用的用于生成均匀分布 、正态分布等特定分布的随机数代码,并不对随机数生成理论进行解释。
二、代码示例
1. 均匀分布uniform distribution
cpp
#include <iostream>
#include <random>
int main()
{
std::random_device rd; // 生成随机数种子
std::mt19937 gen(rd()); // 定义随机数生成引擎
std::uniform_int_distribution<> distrib_int(1, 6); // 定义随机数分布,生成在[1,6]之间的的均匀分布整数
for (int n = 0; n != 10; ++n)
{
std::cout << distrib_int(gen) << ' ';
}
std::cout << '\n';
std::uniform_real_distribution<> distrib_real(1.0, 6.0); // 定义随机数分布,生成在[1.0,6.0]之间的的均匀分布实数
for (int n = 0; n != 10; ++n)
{
std::cout << distrib_real(gen) << ' ';
}
std::cout << '\n';
return 0;
}
2. 正态分布Normal distribution
生成其他分布的随机数跟生成均匀分布的随机数类似,只需要改变随机数生成器
即可。生成均值为5.0
,标准差为2.0
的随机数可以使用以下随机数生成器:
cpp
std::normal_distribution distrib_normal(5.0, 2.0);
3. 泊松分布Poisson distribution
cpp
std::poisson_distribution<> d(4);
4. 离散采样分布Discrete distribution(整数)
cpp
// 假设存在4种事件,
// 事件1发生的概率为 40/(40+10+10+40),
// 事件2发生的概率为 10/(40+10+10+40),
// 事件3发生的概率为 10/(40+10+10+40),
// 事件4发生的概率为 40/(40+10+10+40),
// 那么,采样四种事件的随机数生成器如下:
std::discrete_distribution<> d({40, 10, 10, 40});