gpt4 book ai didi

c++ - 给定二进制随机数生成器生成随机 float 的正确方法?

转载 作者:可可西里 更新时间:2023-11-01 17:54:54 29 4
gpt4 key购买 nike

假设我们有一个二进制随机数生成器 int r();,它将返回 0 或 1,概率均为 0.5。

我查看了 Boost.Random,它们生成了 32 位并执行类似这样的操作(伪代码):

x = double(rand_int32());
return min + x / (2^32) * (max - min);

我对此有一些严重的怀疑。 double 有 53 位尾数,而 32 位永远无法正确生成完全随机的尾数,其中包括舍入误差等。

在半开范围 [min, max) 中创建均匀分布的 floatdouble 的快速方法是什么,假设 IEEE754?这里的重点在于分发的正确性,而不是速度。

为了正确定义正确,正确的分布将等于如果我们采用无限精确的均匀分布随机数生成器并且对于每个数字我们将舍入到最接近的 IEEE754 表示,如果该表示将仍然在 [min, max) 内,否则该数字将不计入分配。

P.S.:我也对开放范围的正确解决方案感兴趣。

最佳答案

AFAIK,正确的(可能也是最快的)方法是首先创建一个 64 位无符号整数,其中 52 个小数位是随机位,指数是 1023,如果将其类型转换为 (IEEE 754) double 将是 [1.0, 2.0) 范围内均匀分布的随机值。所以最后一步是从中减去 1.0,得到范围 [0.0, 1.0] 内均匀分布的随机 double 值。

在伪代码中:

rndDouble = bitCastUInt64ToDouble(1023 << 52 | rndUInt64 & 0xfffffffffffff) - 1.0

这里提到了这个方法: http://xoroshiro.di.unimi.it(参见《在单位区间内生成均匀的 double 》)

编辑:推荐的方法已更改为:(x >> 11) * (1./(UINT64_C(1) << 53))

有关详细信息,请参阅上面的链接。

关于c++ - 给定二进制随机数生成器生成随机 float 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19167844/

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