我通过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
对象)?
1条答案
按热度按时间5t7ly7z51#
.reset()
的存在意味着分布可能有额外的内部状态(因此重置理论上可能会影响输出质量)。但是我已经检查了三大标准库(libstdc++、libc++、MSVC STL),在所有这些库中,
std::discrete_distribution::reset()
都是无操作的(std::uniform_{int,real}_distribution
也是如此)。