我想要得到一个介于1和0之间的随机数。然而,每次我都得到0。有人可以解释一下为什么我每次都得到0吗?这是我尝试过的代码。
Random random = new Random();
int test = random.Next(0, 1);
Console.WriteLine(test);
Console.ReadKey();
Next
返回一个整数随机数,在最小值(包含)和最大值(不包含)之间:
返回值
一个32位有符号整数,大于或等于minValue且小于maxValue;也就是说,返回值范围包括minValue但不包括maxValue。如果minValue等于maxValue,则返回minValue。
唯一满足条件的整数为
0 <= x < 1
值为0
,因此您总是得到值0
。换句话说,0
是唯一在半开区间[0,1)
内的整数。
因此,如果您实际上对整数值0
或1
感兴趣,请将上限设为2
:
var n = random.Next(0, 2);
如果您希望获得0到1之间的小数,请尝试:
var n = random.NextDouble();
public double NextRandomRange(double minimum, double maximum)
{
Random rand = new Random();
return rand.NextDouble() * (maximum - minimum) + minimum;
}
NextRandomRange(0,1 + Double.Epsilon);
/*=====================================Next=====================================
**Returns: A double [0..1)
**Arguments: None
**Exceptions: None
==============================================================================*/
public virtual double NextDouble() {
return Sample();
}
/*====================================Sample====================================
**Action: Return a new random number [0..1) and reSeed the Seed array.
**Returns: A double [0..1)
**Arguments: None
**Exceptions: None
==============================================================================*/
protected virtual double Sample() {
//Including this division at the end gives us significantly improved
//random number distribution.
return (InternalSample()*(1.0/MBIG));
}
InternalSample()*0.0000000004656612873077392578125;
private int InternalSample() {
int retVal;
int locINext = inext;
int locINextp = inextp;
if (++locINext >=56) locINext=1;
if (++locINextp>= 56) locINextp = 1;
retVal = SeedArray[locINext]-SeedArray[locINextp];
if (retVal == MBIG) retVal--;
if (retVal<0) retVal+=MBIG;
SeedArray[locINext]=retVal;
inext = locINext;
inextp = locINextp;
return retVal;
}
private int inext;
private int inextp;
private int[] SeedArray = new int[56];
public Random(int Seed) {
int ii;
int mj, mk;
//Initialize our Seed array.
//This algorithm comes from Numerical Recipes in C (2nd Ed.)
int subtraction = (Seed == Int32.MinValue) ? Int32.MaxValue : Math.Abs(Seed);
mj = MSEED - subtraction;
SeedArray[55]=mj;
mk=1;
for (int i=1; i<55; i++) { //Apparently the range [1..55] is special (All hail Knuth!) and so we're skipping over the 0th position.
ii = (21*i)%55;
SeedArray[ii]=mk;
mk = mj - mk;
if (mk<0) mk+=MBIG;
mj=SeedArray[ii];
}
for (int k=1; k<5; k++) {
for (int i=1; i<56; i++) {
SeedArray[i] -= SeedArray[1+(i+30)%55];
if (SeedArray[i]<0) SeedArray[i]+=MBIG;
}
}
inext=0;
inextp = 21;
Seed = 1;
}
if (retVal == MBIG) retVal--;
// Just try to explain where you got this number during the code review...
NextRandomRange(0,1.0000000004656612875245796924106);
简而言之?
使用随机双精度浮点数的包含范围是棘手的。
但是,如果你还在跟着我,或者你只是因为在顶部读了一条注释而跳到这里,这里有一个非常简单的解决方案,它能够工作,而且不需要你拥有离散浮点数学的博士学位。
解决方案
如果在{0,1}之间生成一个浮点数非常困难,那么我们就生成一个整数然后进行转换。
float fauxFloat = random.Next(0,11)/10;
public double RandomUnitInterval()
{
var_Random = new Random();
int precision = 1000000000;
return (random.Next(0, precision + 1)) / ((double)precision);
}
你可以这样做,但你应该这样做:
double test = random.NextDouble();
如果你想要获得随机整数(0或1),你应该将上限设置为2,因为它是排除的
int test = random.Next(0, 2);
Random.Next(a,b)
返回[a,b)范围内的数字,它大于或等于a,并且小于b。
如果您想获得{0,1}中的一个数字,则应使用:
var random = new Random();
var test = random.Next(0, 2);
因为您要求的数字小于1
。
文档中提到:
返回值
一个32位有符号整数,大于或等于minValue且小于maxValue;也就是说,返回值的范围包括minValue但不包括maxValue。如果minValue等于maxValue,则返回minValue。
如果你的目标是从0.0到1.0,那么像这样重写代码
Random random = new Random();
double test = random.NextDouble();
Console.WriteLine(test);
Console.ReadKey();
>= 0
且< 1
。因此,您将获得您所要求的内容。 - user4003407Random.Next
的文档并检查您提供的值。如果您想要一个非整数,那么您正在使用错误的调用方式。如果您想要获取 0 或 1,则应将 2 作为上限传递给该函数。 - Jon Skeet