为什么C#的随机下限是包含的,而上限是独占的?
Why is C#'s random lower limit inclusive, but upper limit exclusive?
以这段代码为例:
Random rnd = new Random();
int rndNumber = rnd.Next(0,101);
人们会认为会发生以下任一情况:
-rndNumber 包含一个介于 0 和 101
之间的随机整数
-rndNumber 包含一个介于 1 和 100
之间的随机整数
但实际情况是,rndNumber 包含一个 0 到 100 之间的随机整数。为什么会这样?
明白上限是独占的,那为什么下限是包含呢?为什么这不一致?
此方法与使用零作为初始元素的编号方案一致。这在某些情况下很方便,因为您不必进行任何算术运算或面临罕见的差一错误,例如
当您从数组中随机选取一个元素时:
var rndElement = myArray[rnd.Next(0, myArray.Length)];
当你在几个点上分割一个区间,并从每个子区间中随机选取元素时:
var endpoints = new[] {0, 10, 17, 36, 80};
for (int i = 0 ; i+1 < endpoints.Length ; i++) {
var from = endpoints[i];
var to = endpoints[i+1];
Console.WriteLine("({0}..{1}) : {2}", from , to, rnd.Next(from, to));
}
它还可以更轻松地计算可以生成多少个不同的值。
以这段代码为例:
Random rnd = new Random();
int rndNumber = rnd.Next(0,101);
人们会认为会发生以下任一情况:
-rndNumber 包含一个介于 0 和 101
之间的随机整数
-rndNumber 包含一个介于 1 和 100
但实际情况是,rndNumber 包含一个 0 到 100 之间的随机整数。为什么会这样?
明白上限是独占的,那为什么下限是包含呢?为什么这不一致?
此方法与使用零作为初始元素的编号方案一致。这在某些情况下很方便,因为您不必进行任何算术运算或面临罕见的差一错误,例如
当您从数组中随机选取一个元素时:
var rndElement = myArray[rnd.Next(0, myArray.Length)];
当你在几个点上分割一个区间,并从每个子区间中随机选取元素时:
var endpoints = new[] {0, 10, 17, 36, 80};
for (int i = 0 ; i+1 < endpoints.Length ; i++) {
var from = endpoints[i];
var to = endpoints[i+1];
Console.WriteLine("({0}..{1}) : {2}", from , to, rnd.Next(from, to));
}
它还可以更轻松地计算可以生成多少个不同的值。