gpt4 book ai didi

c++ - c++ 中具有多个(不相关?)分布的随机生成器

转载 作者:搜寻专家 更新时间:2023-10-31 02:07:57 25 4
gpt4 key购买 nike

已阅读以下问题:

using one random engine for multi distributions in c++11

Uncorrelated parallel random seeds with C++ 2011?

std::default_random_engine generate values between 0.0 and 1.0

how to generate uncorrelated random sequences using c++

Using same random number generator across multiple functions

并且经历了一些技巧后,我对 c++ 中多个(不同)分布的随机生成器的概念理解产生了疑问。特别是:

  • 是否可以使用一个生成器来绘制不同分布(均匀分布、二项分布等)的数字,只要您不是多线程的?

例如,假设我正在使用以下内容:

class Zsim {
private:
std::default_random_engine engine;
}

并在构造函数中初始化它:

Zsim::Zsim(...)
{
std::random_device rd;
std::default_random_engine generator(rd());
engine = generator;
}

并使用它在不同的分布(二项分布和均匀分布)中绘制 n 个值(n 可能很大),比方说:

std::binomial_distribution<int> B_distribution(9, 0.5);
int number = B_distribution(engine);

std::uniform_real_distribution<double> R_distribution(0, 15);
position.x = R_distribution(engine);
position.y = R_distribution(engine);

这样可以吗?

有人指出使用std::random_device很好,而其他人建议它可以出于多种原因抛出,应该避免或尝试/捕获(参见:Using same random number generator across multiple functions)。

  • using one random engine for multi distributions in c++11 ,有人建议,当在 n 维(MosteM 给出的示例中 n = 2)模拟随机或布朗运动时,每个维度需要一个生成器,否则它们会变得相关,从而产生人为漂移。虽然我同意这个断言,但考虑到发电机的(巨大)周期,这个断言的有效性是什么?如果模拟很大(步骤数很多)?我们是否应该始终在每个维度使用一个生成器作为安全措施?这似乎与how to generate uncorrelated random sequences using c++中的主要回复相矛盾。

  • 最后,给定 Zsim 示例,当您向方法添加 const 限定符并绘制二项分布时:

    int Zscim::get_randomB() const
    {
    std::binomial_distribution<int> B_distribution(9, 0.5);
    int number = B_distribution(engine);
    }

编译器抛出错误:expression having type 'const std::tr1::default_random_engine' would lose some const-volatile qualifiers in order to call 'unsigned long std::tr1::mersenne_twister<_Ty,_Wx,_Nx,_Mx,_Rx,_Px,_Ux,_Sx,_Bx,_Tx,_Cx,_Lx>::operator()(void)

建议在调用分发时以某种方式更改生成器“引擎”。这是什么原因造成的?

最佳答案

如果你读到 UniformRandomBitGenerator您会发现随机生成器将生成随机位,这些位在理想情况下几乎彼此独立,只要有问题的 PRNG 可以实现这一点。所以基本上每次调用 engine() 都会生成一个几乎不相关的整数。分发的任务是对其进行适当数量的调用。单个位分布可能会在每 32 次调用分布本身时对 32 位引擎进行一次调用,缓存调用之间未使用的熵。相反, double 生成器可能使用来自两个 32 位引擎结果的熵来确定 double 的所有 53 个尾数位。引擎不关心哪个分布消耗它的随机位,因此在不同的分布中使用相同的引擎不是问题。

如果您阅读 https://en.wikipedia.org/wiki/Mersenne_Twister你会发现它是

k-distributed to 32-bit accuracy for every 1 ≤ k ≤ 623 (for a definition of k-distributed, see below)

因此,如果您使用 std::mt19937,我会说您应该可以安全地在多达 623 个不同的发行版中使用相同的引擎,无论它们是相同类型还是不同类型。对于更多发行版,这取决于它们的使用方式,但在大多数情况下,我也不会太担心。

关于c++ - c++ 中具有多个(不相关?)分布的随机生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48093621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com