c++ std::discrete_distribution和random numbers质量的内部状态

oyjwcjzk  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(92)

我通过std::discrete_distribution迭代生成随机数。如果在每次迭代后重置分布的内部状态(相当于在循环内创建std::discrete_distribution对象),随机数的质量是否会降低:

// inputs:
//   int n_samples
//   int n_energies
//   double energies[n_energies]

std::mt19937_64 generator;

for (int i = 0; i < n_samples; ++i ) {
    std::discrete_distribution<int> d(energies, energies + n_energies);

    int index = d(generator);

    // DO SMTH WITH INDEX
    // energies array may change between iterations here.
}

字符串
我问这个问题的原因是energies可能会在迭代之间发生变化(取决于算法流,这是不可预测的)。
在一个边界的情况下,他们改变每一个迭代,所以上面的代码是好的,因为没有什么我可以在这里做。
在另一种边界情况下,它们在迭代之间根本不改变。这相当于在概率相同的情况下重置std::discrete_distribution的内部状态。
在后一种情况下,生成的随机数的质量是否低于未重置分布状态时的质量(即,在循环外创建std::discrete_distribution对象)?

5t7ly7z5

5t7ly7z51#

.reset()的存在意味着分布可能有额外的内部状态(因此重置理论上可能会影响输出质量)。
但是我已经检查了三大标准库(libstdc++、libc++、MSVC STL),在所有这些库中,std::discrete_distribution::reset()都是无操作的(std::uniform_{int,real}_distribution也是如此)。

相关问题