我使用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();
我的问题是每次调用时我只从两个变量生成器返回一个值。当我改变vel_e,vel_n或sigma时,值会改变,否则,我会得到相同的值。
我尝试将dist_east,dist_north,east和north对象设为静态,但是在构造之后我无法更改参数。
有没有办法达到我想要的目的?
答案 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