我很惊讶在任何地方都找不到答案,也许我错过了什么。
我需要一个闭区间
我正在处理大量高精度数字(16位),因此即使1.0很少出现,我仍然需要它具备这种能力。虽然
我该如何生成具有闭区间的随机浮点数?我将执行此操作多次,因此最好不要使用需要较长时间才能执行的方法(例如多次调用
System.Random
类的NextDouble
方法返回[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
之间的差异看起来微不足道(通常确实如此),但在这种情况下,这种差异是重要的。
在实现类似于this版本的NextAfter
解决方案后,有时会得到超过最大值的数字(例如,[0.0,5.0]
的5.00000027008353
)
Random.NextDouble() * ((NextAfter(max, max + 1.0) - min) + min);
我该如何生成具有闭区间的随机浮点数?我将执行此操作多次,因此最好不要使用需要较长时间才能执行的方法(例如多次调用
Random
或使用while循环和拒绝抽样)。此外,必须是无偏的,产生均匀的结果(即任何一个数字出现的可能性都不应该比其他数字更高)。
NextDouble
的结果转换为较窄的格式可能会产生不均匀版本。在像.125或.5这样的内部数字周围,存在一些宽度为w的间隔,其中所有数字都舍入到该数字。但是,在0和1处,只有宽度为½ w的间隔中的数字舍入为0或1,因此它们出现的频率比其他数字要少。您可能应该更全面地描述您的问题并要求完整的解决方案,而不仅仅是询问如何关闭NextDouble
间隔。 - Eric Postpischil