C# 在C中生成负随机双精度的方法#

C# 在C中生成负随机双精度的方法#,c#,random,C#,Random,可能重复: 我想生成一个介于-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

可能重复:

我想生成一个介于-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;
}
var rng=new Random();
var randoms=新的双精度[10];
双最小值=-3100.0;
双最大值=-8.0;
对于(var int i=0;i
以下是在一定范围内生成随机数的标准方法。请注意,我制作了几个示例,以说明在使用伪随机数生成器时,您不希望为每个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;
}
var rng=new Random();
var randoms=新的双精度[10];
双最小值=-3100.0;
双最大值=-8.0;
对于(var int i=0;i
问了这个问题后,你会得到一个非常标准的答案

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方法
返回“大于或等于
0.0
,小于
1.0
的双精度浮点数”(如中所述)

因此,既然
rnd.NextDouble()
返回范围
[0;1)
内的数字,那么

rnd.NextDouble() * (MAX_VALUE - MIN_VALUE) + MIN_VALUE
你会得到一个范围内的随机数
[MIN\u VALUE;MAX\u VALUE]
MAX\u VALUE
)。如果这是你想要的,那就太好了。但是如果你想要一个范围内的随机数
[MIN\u VALUE;MAX\u VALUE]
MAX\u 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方法(Int32,Int32)
返回“一个大于或等于minValue且小于maxValue的32位有符号整数;也就是说,返回值的范围包括minValue,但不包括maxValue。”(见附件)

和最后一件事,如果你使用<代码> RND.NestDouple()/Case>方法,并且你必须在一个范围[min,马克斯]中生成大量的随机数,并且你在循环中这样做,你可能要考虑使用<代码> Max值-MyValue循环(或者嵌入的循环)。

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;
双最大值减去最小值=最大值-最小值;
for(int i=0;i
问了这个问题后,你会得到一个非常标准的答案

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方法
返回“大于或等于
0.0
,小于
1.0
的双精度浮点数”(如中所述)

因此,既然
rnd.NextDouble()
返回范围
[0;1)
内的数字,那么

rnd.NextDouble() * (MAX_VALUE - MIN_VALUE) + MIN_VALUE
你会得到一个范围内的随机数
[MIN\u VALUE;MAX\u VALUE]
MAX\u VALUE
)。如果这是你想要的,那就太好了。但是如果你想要一个范围内的随机数
[MIN\u VALUE;MAX\u VALUE]
MAX\u 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方法(Int32,Int32)
返回“一个大于或等于minValue且小于maxValue的32位有符号整数;也就是说,返回值的范围包括minValue,但不包括maxValue。”(见附件)

和最后一件事,如果你使用<代码> RND.NestDouple()/Case>方法,并且你必须在一个范围[min,马克斯]中生成大量的随机数,并且你在循环中这样做,你可能要考虑使用<代码> Max值-MyValue循环(或者嵌入的循环)。

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;
双最大值减去最小值=最大值-最小值;
for(int i=0;i
Try:Try:0.5*(-8-(-3100))+(-3100)=0.5*3092-3100=1546-3100=-1554.0.5*(-8-(-3100))+(-3100)=0.5*3092-3100=1546-3100=-1554。