C#随机浮点关闭时间间隔

时间:2018-05-31 01:28:31

标签: c# random floating-point intervals

我很惊讶我无法在任何地方找到答案,所以也许我错过了一些东西。

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.01.0000001192092895508之间的差异似乎可以忽略不计(通常也是如此),但差异在这种情况下很重要。

在实施类似于NextAfter 5.00000027008353版本的解决方案后,我有时会获得大于最大值的数字(例如[0.0,5.0]的{​​{1}})

Random.NextDouble() * ((NextAfter(max, max + 1.0) - min) + min);

如何以闭合间隔生成随机浮点数?我将执行这么多次,所以最好不要执行太长时间(例如多次调用Random或使用while循环和拒绝采样)。此外,必须是公正的,产生统一的结果(即,任何数字都不应该比任何其他数字出现更多)。

2 个答案:

答案 0 :(得分:2)

这似乎很简单:

  • 决定您希望1.0平均出现的频率。比如说,每十亿次就有一次。
  • 从钟形分布生成0到20亿之间的随机整数,平均值为10亿。叫它n。
  • 在开放时间间隔内生成n个随机数。
  • 生成1.0。
  • 重复。

现在,您在关闭的时间间隔内有一系列随机数,其中1.0出现平均预期的次数。每十亿左右就会得到一个昂贵的钟形计算,它会基本上分摊成本为零。

答案 1 :(得分:0)

浮点数的位表示意味着有限数量的不同值。确定可能的浮点值的数量,在该范围内获得一个随机int,并将该值映射/转换为浮点范围。