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

Cle*_*der 3 c# random

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

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

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

Dav*_*nan 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)
Run Code Online (Sandbox Code Playgroud)

注意:此API的设计很奇怪.它有特殊的案例处理minValue == maxValue,似乎不必要地使API复杂化.如果我设计了这个API,我会将这两个参数都包含在内.这将导致令人愉悦的对称性,并允许覆盖整个范围的随机数int.