gpt4 book ai didi

c++ - std::uniform_real_distribution 使用多少个随机数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:46 25 4
gpt4 key购买 nike

我很惊讶地看到这个程序的输出:

#include <iostream>
#include <random>

int main()
{
std::mt19937 rng1;
std::mt19937 rng2;
std::uniform_real_distribution<double> dist;

double random = dist(rng1);
rng2.discard(2);

std::cout << (rng1() - rng2()) << "\n";

return 0;
}

0 - 即 std::uniform_real_distribution 使用两个 随机数生成随机 double 值范围 [0,1)。我认为它只会生成一个并重新调整它。考虑之后,我猜这是因为 std::mt19937 产生 32 位整数,而 double 是这个大小的两倍,因此不够“随机”。

问题:如果随机数生成器和浮点类型是任意类型,我如何一般地找出这个数字?

编辑:我刚刚注意到我可以改用 std::generate_canonical,因为我只对 [0,1) 的随机数感兴趣。不确定这是否有所作为。

最佳答案

对于 template<class RealType, size_t bits, class URNG> std::generate_canonical该标准(第 27.5.7.2 节)明确定义了对统一随机数生成器 (URNG) 的调用次数

最大(1, b/log_2 R),

其中 b 是 RealType 的尾数中的最小位数和作为模板参数提供给 generate_canonical 的位数。R 是 URNG 可以返回的数字范围 (URNG::max()-URNG::min()+1) .但是,在您的示例中,这不会有任何区别,因为您需要两次调用 mt19937 来填充 double 尾数的 53 位。

对于其他分布,该标准未提供通用方法来获取有关 URNG 必须生成多少个数字才能获得分布的一个数字的任何信息。

一个原因可能是对于某些分布,生成分布的单个数字所需的统一随机数的数量不是固定的,并且可能因调用而异。一个例子是 std::poisson_distribution ,它通常实现为一个循环,在每次迭代中绘制一个统一的随机数,直到这些数字的乘积达到某个阈值(例如参见 implementation of the GNU C++ library(第 1523-1528 行))。

关于c++ - std::uniform_real_distribution 使用多少个随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17787222/

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