在C#中生成负随机Double的方法
本文关键字:随机 Double 方法 | 更新日期: 2023-09-27 18:16:46
可能重复:
两个双数之间的随机数
我想生成一个介于-8.000和-3100.000之间的数字。
如何做到这一点?
最有效的代码是什么?
以下是在一定范围内生成随机数的标准方法。注意,我制作了几个来说明,当使用伪随机数生成器时,您不想为每个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;