更改随机数生成器的参数

Change parameters of random number generator

本文关键字:参数 随机数生成器      更新时间:2023-10-16

我正在使用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、东和北对象设为静态,但在构造后无法更改参数。

有没有办法实现我想要的?

在我看来,最快的方法是与 sigma 1 和平均值 0 进行正态分布。通过这种方式,您可以从任何正态分布中获取值,只需乘以新的西格玛并添加平均值即可。

y = mean + sigma * x

如果 U 是均值为 0 且方差为 1 的正态分布随机变量,则

V = mu + sigma * U

正态分布,均值 mu 和方差西格玛²

因此,您所需要的只是生成标准的正态随机变量(平均值 0,stdev 1)并正确缩放它们。

我认为你可能以错误的方式处理这个问题。与其修改随机数生成器以获得所需的平均值和偏差,不如让随机生成器始终为您提供均匀分布。然后,创建自己的函数,将这种均匀分布作为输入,并将所需的分布作为输出。

如果你想要正态分布,

你可以在维基百科页面看到,从均匀分布生成正态分布非常容易。

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

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