【问题标题】:Use rand5(), to generate rand7() (with the same probability) [duplicate]使用 rand5(),生成 rand7()(概率相同)[重复]
【发布时间】:2012-05-14 21:57:24
【问题描述】:

可能重复:
Expand a random range from 1–5 to 1–7

我在这里看到了这个问题:Link

作者提供的解决方案似乎没有产生相同的概率。

例如,在对函数的 10k 次调用中,数字 4 被返回了 1-2 次(而其他数字,如 2,每次返回大约 2k 次)。

可能是我理解错了,或者算法写错了,但是这里:

    static int rand5()
    {
        return new Random().Next(1, 6);
    }
    static int rand7()
    {
        while (true)
        {
            int num = 5 * (rand5() - 1) + rand5();
            if (num < 22) return ((num % 7) + 1);
        }
    }
    static void Main(string[] args)
    {
        int limit = 10000;
        int[] scores = new int[7];
        for (int i = 0; i < limit; i++)
        {
            scores[rand7() - 1]++;
        }
        foreach (int n in scores)
        {
            Console.Write(n + " ");
        }
        Console.WriteLine();
    }

提前致谢。

【问题讨论】:

    标签: c# probability


    【解决方案1】:

    您没有在 Rand5 中生成随机数。

    这样做:

    static Random rand = new Random()
    static int rand5()
    {
        return rand.Next(1, 6);
    }
    

    【讨论】:

    • 那行得通,我所说的 rand5() 和你的有什么区别?
    • 伙计,不同之处在于他一直使用同一个 rand 对象。实际上有一个著名的案例,有人注意到计算机编程中的类似故障多次中了乐透。问题在于,要生成随机数,计算机需要建立一个“种子”。每次执行“新”操作时都重新创建它实际上阻止了它的随机性,因为它模式化了计算机使用的种子值的创建。
    • Random 使用固定的随机数序列。当您执行new Random 时,您会根据当前时间在序列中选择一个起始位置。由于您一直拨打new Random,因此您每次都选择相同的起始位置并返回相同的号码。我的代码选择一次起点,然后每次从序列中返回下一个数字。
    • 谢谢 andrianm 和 Dylan,现在我明白了。顺便问一下,你知道c# Random 类是基于什么种子吗?只是当前时间?
    • 文档只是说“默认种子值来自系统时钟并且具有有限的分辨率”msdn.microsoft.com/en-us/library/h343ddh9.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2013-12-11
    • 1970-01-01
    • 2017-03-24
    • 2017-04-10
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多