c# Double.MinValue 和 Double.MaxValue 之间的随机数
Posted
技术标签:
【中文标题】c# Double.MinValue 和 Double.MaxValue 之间的随机数【英文标题】:c# Random number between Double.MinValue and Double.MaxValue 【发布时间】:2021-04-30 05:05:56 【问题描述】:我已经通过谷歌搜索了,但还没有答案。
所以问题是,我需要创建如下随机生成器 API:
public static Double Range(Double minValue, Double maxValue)
return random.NextDouble() * (maxValue - minValue) + minValue; // random is just System.Random
一切正常,直到我将 Double.MinValue 和 Double.MaxValue 放入参数中,因为它会生成“无限”无效双精度(因为该操作会产生 64 位之外的值双倍范围)。
有没有办法编写代码,以便在使用 Double.MinValue 和 Double.MaxValue 时也能处理和生成有效的双精度数?
【问题讨论】:
考虑调用 random 两次 - 一次获取值,另一次获取符号。然后return random.NextDouble() * double.MaxValue * sign;
注意这可能不一定会返回MaxValue
和MinValue
本身——但它会非常接近。 请注意,这可能会或可能不会为您提供您希望的值分布。
即使你完成了这项工作,它也不会给出你期望的结果,因为范围很广。您的代码真的可以处理非常小 (-1E100) 非常小 (1E-100) 或非常大 (1E100) 的随机数吗?
【参考方案1】:
考虑将计算随机双精度的逻辑更改为类似
private static Double Range(Double minValue, Double maxValue)
var x = random.NextDouble();
return x * maxValue + (1 - x) * minValue;
你失败的原因是因为double.MinValue
是负面的,因此如果你做maxValue - minValue
,你实际上是在做double.MaxValue * 2
。
【讨论】:
这段代码总是产生相同的结果:1.79769313486232E+308,所以它似乎不正确。 @Zer0 我确实在调试中使用普通 System.Console.WriteLine() 打印它,没有任何格式。很奇怪我们得到不同的结果。 你不要把new Random()
放在这样的方法中,你把它作为参数传递。
你不应该在每次调用方法时都创建Random
实例,否则会出现这种情况:Random.Next returns always the same values
好吧,由于某种原因,现在似乎可以工作了。是的,正如@TheodorZoulias 所说,不要将 new Random() 放入方法中,只需创建一次并缓存它。以上是关于c# Double.MinValue 和 Double.MaxValue 之间的随机数的主要内容,如果未能解决你的问题,请参考以下文章