我正在编写一个方法,它将生成1到6之间的unsigned int(包括边界)。我现有的方法如下。
private static Random random = new Random();
...
private static uint GetRandomChannel()
{
return Convert.ToUInt32(random.Next(1, 6));
}
我已经运行了这个方法一千次而且我得到了数字1到5但从未得到6.为什么会发生这种情况,我该如何解决?
答案 0 :(得分:8)
random.Next()
的第二个参数是独占上限。
<强>参数强>
minValue :返回的随机数的包含下限。
maxValue:返回的随机数的独占上限。 maxValue 必须 大于或等于 minValue 。
返回值
大于或等于 minValue 且小于 maxValue 的32位有符号整数;也就是说,返回值的范围包括 minValue ,但不包括 maxValue 。如果 minValue 等于 maxValue ,则返回 minValue 。
这意味着random.Next(1, 6)
只会返回n
范围内的值1 <= n < 6
。
因此,对于模具滚动模拟,您需要使用
random.Next(1, 7)
注意:此API的设计很奇怪。它具有minValue == maxValue
的特殊情况处理,似乎不必要地使API复杂化。如果我设计了这个API,我会将这两个参数都包含在内。这会产生令人愉悦的对称性,并允许随机数覆盖int
的整个范围。
答案 1 :(得分:4)
根据MSDN,上限是独占,而下限是包含。
Random.Next Method (Int32, Int32)
所以你的代码应该是:
return Convert.ToUInt32(random.Next(1, 7));
答案 2 :(得分:2)
根据MSDN文档here,random.Next
函数返回的值严格小于MaxValue
(在您的情况下为6)。
答案 3 :(得分:1)
你无法“修复”这个;这正是this method的意思:
大于或等于零且小于的32位有符号整数 MaxValue的。
因此,如果要在[a,b]中生成随机整数,则需要使用.Next(a, 1 + b)
。
答案 4 :(得分:1)
根据method documentation,下限是包含的,上限是独占的。这意味着random.Next(lower,upper)将返回较低的数字,但保证永远不会返回较高的数字。