我很惊讶我无法在任何地方找到答案,所以也许我错过了一些东西。
NextDouble
类的System.Random
方法返回[0.0,1.0)
范围内的双精度数。这是一个半开的间隔,返回0.0 <= x < 1.0
。
我需要一个关闭的时间间隔[0.0,1.0]
,以便0.0 <= x <= 1.0
。在C ++中,我可以使用std::nextafter
,它返回大于传递参数的最小可表示浮点(例如std::nextafter(1.0, 2.0)
将返回1.0000001192092895508
)。我似乎无法找到C#中的等价物。
我正在使用大量高精度数字(16位),所以尽管1.0很少出现,但我仍然需要它才能够。虽然1.0
和1.0000001192092895508
之间的差异似乎可以忽略不计(通常也是如此),但差异在这种情况下很重要。
在实施类似于NextAfter
5.00000027008353
版本的解决方案后,我有时会获得大于最大值的数字(例如[0.0,5.0]
的{{1}})
Random.NextDouble() * ((NextAfter(max, max + 1.0) - min) + min);
如何以闭合间隔生成随机浮点数?我将执行这么多次,所以最好不要执行太长时间(例如多次调用Random
或使用while循环和拒绝采样)。此外,必须是公正的,产生统一的结果(即,任何数字都不应该比任何其他数字出现更多)。
答案 0 :(得分:2)
这似乎很简单:
现在,您在关闭的时间间隔内有一系列随机数,其中1.0出现平均预期的次数。每十亿左右就会得到一个昂贵的钟形计算,它会基本上分摊成本为零。
答案 1 :(得分:0)
浮点数的位表示意味着有限数量的不同值。确定可能的浮点值的数量,在该范围内获得一个随机int,并将该值映射/转换为浮点范围。