std::d iscrete_distribution 和随机数质量的内部状态

Internal state of std::discrete_distribution and random numbers quality

提问人:user2052436 提问时间:11/14/2023 最后编辑:HolyBlackCatuser2052436 更新时间:11/16/2023 访问量:64

问:

我正在通过 迭代生成随机数。如果在每次迭代后重置分布的内部状态(这相当于在循环中创建对象),随机数的质量是否会降低:std::discrete_distributionstd::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

在一种边框情况下,它们会更改每次迭代,因此上面的代码是可以的,因为在这里我无能为力。

在另一种边框情况下,它们在迭代之间根本不会更改。这相当于重置 while 概率相同时的内部状态。std::discrete_distribution

在后一种情况下,生成的随机数的质量是否不如未重置分布状态(即在循环外创建对象)时的质量?std::discrete_distribution

C++ C++11 随机

评论

1赞 pjs 11/15/2023
生成的值的质量取决于 提供的 U(0,1) 的质量。如果你正在改变参数化但保持不变,后者应该继续产生一个 U(0,1) 序列,这些序列通过了独立性和均匀性的统计检验,所以你应该没问题。继续实例化 的新实例可能代价高昂,但您可以通过使实例化以是否更改为条件来最大程度地避免这种情况。discrete_distributiongeneratordiscrete_distributiongeneratordiscrete_distributionenergies
1赞 Igor Tandetnik 11/15/2023
换句话说:它本身不包含任何不确定的内部状态。它只是执行简单的确定性数学运算,将均匀分布转换为离散分布。所有可能影响质量的有趣东西都在 .discrete_distribution[0, 1]generator
0赞 user2052436 11/15/2023
Tnx、pjs 和 Igor。
0赞 HolyBlackCat 11/16/2023
@IgorTandetnik 你说的“非威慑”状态是什么意思?它可以包含一些状态。
0赞 Igor Tandetnik 11/16/2023
@HolyBlackCat我的意思是,在给定生成器的相同输入序列的情况下,使用相同的权重集初始化的每个实例都将产生相同的输出。OP担心某一实例的过去历史可能会影响其未来的产出;先前已调用的实例的行为可能与具有相同权重的新构造实例不同。我不认为是这样。discrete_distributiondiscrete_distributionoperator()

答:

1赞 HolyBlackCat 11/16/2023 #1

的存在本身就意味着分布可能具有额外的内部状态(因此重置理论上可能会影响输出质量)。.reset()

但是我已经检查了三大标准库(libstdc++、libc++MSVC STL),它们在所有这些库中都是空操作的。(同样。std::discrete_distribution::reset()std::uniform_{int,real}_distribution