答案 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;