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。