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.MinValueDouble.MaxValue 放入参数中,因为它会生成“无限”无效双精度(因为该操作会产生 64 位之外的值双倍范围)。

有没有办法编写代码,以便在使用 Double.MinValueDouble.MaxValue 时也能处理和生成有效的双精度数?

【问题讨论】:

考虑调用 random 两次 - 一次获取值,另一次获取符号。然后return random.NextDouble() * double.MaxValue * sign; 注意这可能不一定会返回MaxValueMinValue 本身——但它会非常接近。 请注意,这可能会或可能不会为您提供您希望的值分布。 即使你完成了这项工作,它也不会给出你期望的结果,因为范围很广。您的代码真的可以处理非常小 (-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 之间的随机数的主要内容,如果未能解决你的问题,请参考以下文章

C# “值类型“和“引用类型“在内存的分配

C# “值类型“和“引用类型“在内存的分配

如何在 C# 中使用 3 个数组分配变量

编写高质量c#代码的10个建议

C#基础入门学习笔记——C#的四种基本数据类型

C# Math.pow(x, 0.333)