【问题标题】:Unable to include upper bound when generating random integer numbers生成随机整数时无法包含上限
【发布时间】:2012-01-26 20:39:41
【问题描述】:

我正在编写一个方法,该方法将生成 1 到 6 之间的无符号整数(包括边界)。我目前的方法如下。

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

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

【问题讨论】:

    标签: c# random


    【解决方案1】:

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

    参数

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

    maxValue: 返回的随机数的唯一上界。 maxValue 必须 大于或等于 minValue

    返回值

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

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

    因此,对于您的滚模模拟,您需要使用

    random.Next(1, 7)
    

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

    【讨论】:

    • 更令人失望的是,我一直在反复调用 random.Next(n, n+1) ,结果似乎根本不是随机的!
    • @SeanU 这完全是随机的!唯一与真正的RNG没有区别的伪RNG! ;-)
    【解决方案2】:

    根据MSDN,上限是exclusive,而下限是inclusive

    Random.Next Method (Int32, Int32)

    所以你的代码应该是:

    return Convert.ToUInt32(random.Next(1, 7));
    

    【讨论】:

      【解决方案3】:

      根据 MSDN 文档 hererandom.Next 函数返回的值严格小于 MaxValue(在您的情况下为 6)。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-09-14
            • 1970-01-01
            • 2023-03-08
            • 1970-01-01
            • 2018-10-09
            • 2014-08-22
            • 1970-01-01
            相关资源
            最近更新 更多