改变随机数发生器的参数

时间:2011-05-17 12:01:47

标签: c++ boost random

我使用boost::random生成随机速度值,我想根据用户输入更改均值和方差。

我使用以下内容:

typedef boost::mt19937 RNG;
static RNG rng();

typedef boost::normal_distribution<double> DIST;
DIST dist_east(vel_e, sigma);
DIST dist_north(vel_n, sigma);

boost::variate_generator<RNG, DIST> east(rng, dist_east);
boost::variate_generator<RNG, DIST> north(rng, dist_north);

velocity.east = east();
velocity.north = north();

我的问题是每次调用时我只从两个变量生成器返回一个值。当我改变v​​el_e,vel_n或sigma时,值会改变,否则,我会得到相同的值。

我尝试将dist_east,dist_north,east和north对象设为静态,但是在构造之后我无法更改参数。

有没有办法达到我想要的目的?

3 个答案:

答案 0 :(得分:4)

在我看来,最快的方法是使用sigma 1和平均值0进行正态分布。这样,您可以从任何正态分布中获取值,只需乘以新的sigma并添加均值。

y = mean + sigma * x

答案 1 :(得分:3)

如果 U 是一个正态分布的随机变量,其均值为0且方差为1,那么

V = mu + sigma * U

通常以 mu 和方差sigma²分布。

所以你需要的是生成标准的正常随机变量(平均0,stdev 1)并正确缩放它们。

答案 2 :(得分:0)

我认为你可能会以错误的方式解决问题。您应该使随机生成器始终为您提供统一分布,而不是修改随机数生成器以使您具有所需的均值和偏差。然后,创建自己的函数,将此均匀分布作为输入,并将所需的分布作为输出。

如果你想要正态分布,你可以看到in the Wikipedia page从统一分布中生成正态分布非常容易。

编辑:这是一些伪代码(我不知道增强随机生成器是如何工作的)

generateNormalDistribution(mean, deviation)  
    X = boost::uniformGeneratorBetween0and1  
    Y = boost::uniformGeneratorBetween0and1  
    return [sqrt(-2*ln(X)) * cos(2*pi*Y)]*deviation + mean