c#介于Double.MinValue和Double.MaxValue之间的随机数

c#介于Double.MinValue和Double.MaxValue之间的随机数,c#,random,double,min,infinite,C#,Random,Double,Min,Infinite,我已经在谷歌上搜索过了,还没有找到答案 所以问题是,我需要创建随机生成器API,如下所示: public static Double Range(Double minValue, Double maxValue) { return random.NextDouble() * (maxValue - minValue) + minValue; // random is just System.Random } 在我将Double.MinValue和Double.MaxValue放入参数

我已经在谷歌上搜索过了,还没有找到答案

所以问题是,我需要创建随机生成器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也可以处理和生成有效的double?

考虑将计算随机double的逻辑更改为

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

请考虑调用random两次,一次用于获取值,另一次用于符号。然后
返回random.NextDouble()*double.MaxValue*符号注意,这不一定会返回
MaxValue
MinValue
本身,但它会非常接近。请注意,这可能会,也可能不会,给你你希望的价值分布。即使你做到了,它也不会给你期望的结果,因为范围太广了。您的代码真的可以处理非常小(-1E100)非常小(1E-100)或非常大(1E100)的随机数吗?此代码总是生成相同的结果:1.79769313486232E+308,因此它似乎不正确。@Zer0我在调试时使用普通的System.Console.WriteLine()打印了它,但没有任何格式。奇怪的是,我们得到了不同的结果。你没有在这样的方法中放入
new Random()
,而是将其作为参数传递。你不应该每次调用该方法时都创建
Random
实例,否则会发生这种情况:出于某种原因,OK现在似乎可以工作了。是的,正如@TheodorZoulias所说,不要将new Random()放入方法中,只需创建一次并缓存它。