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

时间:2015-07-05 17:25:29

标签: python c++11 gaussian

我试图在C ++ 11中使用mean和sigma获得高斯分布。我已成功将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);

1 个答案:

答案 0 :(得分:2)

算法分为两部分:

  • 统一随机数生成器,
  • 并根据高斯分布将均匀随机数转换为随机数。

在您的情况下,e2是您的统一随机数生成器,给定种子rdstd::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