我有一个强大的 RNG,可以生成随机的 32 位(无符号)整数。众所周知,对于 Metropolis MC 模拟,需要 0 到 1 之间的随机数来确定移动的接受/拒绝,因此我需要将我的 32 位 int 转换为(双精度)浮点值。
我的问题是将我的 32 位 int 转换为浮点数的最佳实践是什么?我想我有以下两个选择:
(double) getRandomNumber() / 4294967295(2^32 - 1); 范围 [0,1](double) getRandomNumber() / 4294967296(2^32); 范围 [0,1)
第一个选项看起来很简单,范围为 [0,1]。在 [0,0.5) 范围内将有 2147483648 个值,在 (0.5, 1] 范围内将有 2147483648 个值。
在第二个选项中,我们有一个 [0,1) 的范围,并且 0.5 在 2^32 个可能的浮点数中精确表示。对称性在于 50% 的值在 [0, .49999999977] 范围内,而其他 50% 在 [0.5, .99999999977] 范围内。
我缺少的 int->double 转换中是否有详细信息?这种类型的概率模拟范围的标准做法是什么?是 [0,1]、(0,1]、[0,1) 还是 (0,1)?还是我为一件小事而发火?
注意我已经读过除法比乘法效率低,所以我打算在我的实际实现中预先计算倒数并乘以那个值。