C++11 中均值和西格玛的高斯分布

Gaussian distribution with mean and sigma in C++11

我正在尝试在 C++11 中使用均值和西格玛获得高斯分布。我已成功将 Python 转换为 C++,但我对初始化随机生成器的方式有疑问。我是否需要在调用中调用 random_device() 和 mt19937() 以获得分发,或者我是否可以只静态调用一次并一直重复使用它们?保留代码原样的成本是多少?

# Python

# random.gauss(mu, sigma)
# Gaussian distribution. mu is the mean, and sigma is the standard deviation.

import random

result = random.gauss(mu, sigma)


// C++11

#include <random>

std::random_device rd;
std::mt19937 e2(rd());

float res = std::normal_distribution<float>(m, s)(e2);

算法分为两部分:

  • 均匀随机数生成器,
  • 并将均匀随机数转化为服从高斯分布的随机数

在你的例子中,e2 是给定种子 rd 的统一随机数生成器,std::normal_distribution<float>(m, s) 生成一个执行算法第二部分的对象。

最好的方法是:

// call for the first time (initialization)
std::random_device rd;
std::mt19937 e2(rd());
std::normal_distribution<float> dist(m, s);
// bind the distribution generator and uniform generator
auto gen_gaussian = std::bind(dist, e2);

// call when you need to generate a random number
float gaussian = gen_gaussian();

如果你不关心使用哪个统一随机数生成器,你可以使用std::default_random_engine而不是std:mt19937