在C#中生成负随机Double的方法

本文关键字:随机 Double 方法 | 更新日期: 2023-09-27 18:16:46

可能重复:
两个双数之间的随机数

我想生成一个介于-8.000和-3100.000之间的数字。

如何做到这一点?

最有效的代码是什么?

在C#中生成负随机Double的方法

以下是在一定范围内生成随机数的标准方法。注意,我制作了几个来说明,当使用伪随机数生成器时,您不想为每个RNG创建一个新的RNG,以避免它们可能具有相同种子值的情况。

var rng = new Random();
var randoms = new double[10];
double MIN_VALUE = -3100.0;
double MAX_VALUE = -8.0;
for (var int i = 0; i < randoms.Length; ++i)
{
    randoms[i] = rng.NextDouble() * (MAX_VALUE - MIN_VALUE) + MIN_VALUE;
}

问完这个问题后,人们会得到一个很标准的答案,那就是做

Random rnd = new Random();
double MIN_VALUE = -3100.0;
double MAX_VALUE = -8.0;
double random_value = rnd.NextDouble() * (MAX_VALUE - MIN_VALUE) + MIN_VALUE;

然而,恐怕这不是100%正确的。好吧,这取决于你所说的"一个介于">之间的数字是什么意思。原因如下:

Random.NextDouble Method返回"大于或等于0.0且小于1.0的双精度浮点数。">(如MSDN Library中所述(

因此,由于rnd.NextDouble()返回范围为[0; 1)的数字,因此当您执行时

rnd.NextDouble() * (MAX_VALUE - MIN_VALUE) + MIN_VALUE

您将得到范围为[MIN_VALUE; MAX_VALUE)(仅限于MAX_VALUE(的随机数。如果这是你想要的,那就太好了。但是,如果你想要一个范围为[MIN_VALUE; MAX_VALUE](包括MAX_VALUE——我相信你做到了(的随机数,该怎么办?

好吧,我不知道如何用非常精确的双数来做到这一点。所以,我假设当你写"-8.000">"-310.000">时,你的意思是,你希望随机生成的数字的精度为0.001。这就是我试图实现的方式:

Random rnd = new Random();
double MIN_VALUE = -3100.0;
double MAX_VALUE = -8.0;
int PRECISION = 1000;
int min = (int)(MIN_VALUE * PRECISION);    //I know these could be sent as arguments to rnd.Next(),
int max = (int)(MAX_VALUE * PRECISION);    //but I wanted to keep it easier to read and understand
double random_value = rnd.Next(min, max + 1);    //[-3100000; -8000]
random_value /= PRECISION;

这将给你一个在[-3100.000; -8.000]范围内的随机数。

如果我使用rnd.Next(min, max),那么结果将在[-3100.000; -8.001]的范围内,这是因为Random.Next Method (Int32, Int32)返回"一个大于或等于minValue且小于maxValue的32位有符号整数;也就是说,返回值的范围包括minValue,但不包括maxValue。">(请参阅Random.Next Method (Int32, Int32)

最后,如果你使用rnd.NextDouble()方法,并且你必须在[Min,Max]范围内生成大量的随机数,并且你在循环中进行,你可能需要考虑将MAX_VALUE - MIN_VALUE从循环(或嵌入循环(中取出。不需要每次都计算。

double MAX_MINUS_MIN = MAX_VALUE - MIN_VALUE;
for (int i = 0; i < BIG_SCARY_NUMBER; ++i)
    for (int j = 0; j < BIG_SCARY_NUMBER; ++j)
        for (int k = 0; k < BIG_SCARY_NUMBER; ++k)
            randoms[i, j, k] = rnd.NextDouble() * MAX_MINUS_MIN + MIN_VALUE;