从数组中选择特定数字的概率

Dav*_*ita 2 .net c# math probability

我正在挠头2天,无法弄清楚我的代码有什么问题.可以说我有2个数组:

Array1[33]: 0..31 (it has 2 fives)
Array2[32]: 0..31 (it has one five)
Run Code Online (Sandbox Code Playgroud)

现在我想计算从第一个数组中随机选取5的概率和从第二个数组中随机选择5的概率.我用这个公式做到这一点:

(2M / 33) * (1M / 32)
Run Code Online (Sandbox Code Playgroud)

这是粗略的0.001894.现在,如果我运行周期足够长,比如1000,000,0我应该期望'5''5'大约上升18940次,但是当我运行测试时这不会发生.这是代码:

public class Program
{
    private static List<int> numbers1 = new List<int>();
    static Random random = new Random(Guid.NewGuid().GetHashCode());
    private static List<int> numbers2 = new List<int>();

    static void Main(string[] args)
    {
        for (int i = 0; i < 33; i++)
        {
            numbers1.Add(i);
            numbers2.Add(i);
        }

        numbers1.Add(5);

        while (true)
        {
            var counter = 0;
            for (int i = 0; i < 10000000; i++)
            {
                var num1 = numbers1[random.Next(0, 33)];
                var num2 = numbers2[random.Next(0, 32)];

                if (num1 == 5 && num2 == 5) counter++;
            }

            Console.Write(counter + ": " + (decimal) counter / 10000000 + " - " + (2M / 33) * (1M / 32));
            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

模式'5''5'出现在9300-9500次,当它应该出现两倍的次数.

所以我的问题是,我的数学/代码出了什么问题?

谢谢

编辑:

请注意,如果我在第一个数组中只留下五个,那么一切都按预期工作.

    //numbers1.Add(5);

    while (true)
    {
        var counter = 0;
        for (int i = 0; i < 10000000; i++)
        {
            var num1 = numbers1[random.Next(0, 33)];
            var num2 = numbers2[random.Next(0, 32)];

            if (num1 == 5 && num2 == 5) counter++;
        }

        Console.Write(counter + ": " + (decimal) counter / 10000000 + " - " + (1M / 33) * (1M / 32));
        Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

此代码返回预期结果

Dir*_*irk 5

解决方案非常简单:您向阵列添加了太多元素.

for (int i = 0; i < 33; i++)
{
    numbers1.Add(i);
    numbers2.Add(i);
}
Run Code Online (Sandbox Code Playgroud)

向数组添加33个元素而不是32 元素.

Random.Next(a, b)[a, b)(半开间隔)之间生成一个随机数.因此random.Next(0, 33)将生成0到32(含)之间的数字.您添加的附加5 numbers1将永远不会被检索,因为它位于索引33处.

如此简单,在创建数据时将33更改为32,它将起作用.