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

时间:2011-12-03 17:42:47

标签: c# random

  

可能重复:
  Random Number Between 2 Double Numbers

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

如何实现这一目标?

什么是效率最高的代码?

2 个答案:

答案 0 :(得分:6)

这是在一个范围内生成随机数的标准方法。请注意,我正在制作几个,以说明在使用伪随机数生成器时,您不希望为每个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;
}

答案 1 :(得分:0)

在问这个问题之后会得到一个非常标准的答案

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。”(如{ {3}})

因此,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”“ - 3100.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的32位有符号整数并且小于maxValue;也就是说,返回值的范围包括minValue但不包括maxValue。“(参见MSDN Library

最后一点,如果你使用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;