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

3

我正在编写一个方法,用于生成介于1和6之间(包括边界)的无符号整数。 我目前拥有的方法如下所示。

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

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

5个回答

8
random.Next()的第二个参数是一个独占的上限。

参数

minValue: 返回的随机数的包含下限。

maxValue: 返回的随机数的独占上限。 maxValue必须大于或等于minValue

返回值

一个32位有符号整数,大于或等于minValue且小于maxValue;也就是说,返回值的范围包括minValue但不包括maxValue。如果minValue等于maxValue,则返回minValue

这意味着random.Next(1, 6)只会返回在1 <= n < 6范围内的值n

因此,在掷骰子的模拟中,您需要使用

random.Next(1, 7)

注意:这个API的设计很奇怪。它对于minValue == maxValue有特殊情况处理,似乎不必要地使API复杂化了。如果我设计这个API,我会让两个参数都成为包含在内的限制。这将导致一种愉悦的对称性,并允许随机数覆盖整个int范围。


更令人失望的是,我一直在重复调用random.Next(n, n+1),但结果似乎根本不随机! - Sean U
@SeanU 它是完全随机的!唯一一种伪随机数生成器,与真正的随机数生成器无法区分!;-) - David Heffernan

4
根据MSDN文档,上限是不包含在内的,而下限是包含在内的。 Random.Next Method (Int32, Int32) 因此,你的代码应该是:
return Convert.ToUInt32(random.Next(1, 7));

2
根据MSDN文档这里所述,random.Next函数返回的值严格小于MaxValue(在你的情况下为6)。

1

你无法"修复"这个问题;这只是此方法的预期行为:

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

因此,如果你想生成一个在[a, b]范围内的随机整数,你需要使用.Next(a, 1 + b)


1
根据方法文档,下限是包含的,上限是不包含的。这意味着random.Next(lower, upper)将返回下限数字,但保证永远不会返回上限数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接