生成随机整数时无法包含上限

时间:2012-01-26 20:39:42

标签: c# random

我正在编写一个方法,它将生成1到6之间的unsigned int(包括边界)。我现有的方法如下。

        private static Random random = new Random();
        ...
        private static uint GetRandomChannel()
        {
            return Convert.ToUInt32(random.Next(1, 6));
        }

我已经运行了这个方法一千次而且我得到了数字1到5但从未得到6.为什么会发生这种情况,我该如何解决?

5 个答案:

答案 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文档hererandom.Next函数返回的值严格小于MaxValue(在您的情况下为6)。

答案 3 :(得分:1)

你无法“修复”这个;这正是this method的意思:

  

大于或等于零且小于的32位有符号整数   MaxValue的。

因此,如果要在[a,b]中生成随机整数,则需要使用.Next(a, 1 + b)

答案 4 :(得分:1)

根据method documentation,下限是包含的,上限是独占的。这意味着random.Next(lower,upper)将返回较低的数字,但保证永远不会返回较高的数字。