0

问题提示

生日问题。假设人们一次进入一个房间。人们必须如何进入直到两个人共享生日?与直觉相反,在 23 人进入房间后,两人生日相同的概率约为 50-50。这种现象被称为生日问题或生日悖论。编写一个程序 Birthday.java,它接受两个整数命令行参数 n 和试验,并执行以下试验,试验次数:

为下一个人选择生日,在 0 和 n-1 之间均匀随机。让那个人进入房间。如果该人与房间里的其他人共享生日,请停止;否则重复。在每个实验中,计算进入房间的人数。打印一个表格,总结从 1 到分数达到的每个可能值 i 的结果(计数 i、恰好 i 人进入房间的次数以及 i 或更少人进入房间的次数) (或超过)50%。从离散分布中抽样

输出的外观示例

这是我的代码。我一直只输出一行,(1 999999.0 0.999999)并且无法弄清楚出了什么问题。

public class Birthday {
    
    public static void main (String[]args)
    {
        int n = Integer.parseInt(args[0]);
        int trials = Integer.parseInt(args[1]);
        
        int[] times = new int[n];
        boolean [] found = new boolean[n-1];
        
        for (int i=0; i<trials; i++)
        {
            for (int j=0; j<n; j++)
            {
                int rand = (int) Math.random() * n;
                
                if (!found[rand])
                {
                    found[rand] = true;
                }
                else 
                {
                    times[j]++;
                    break;
                }
            }
        }
        
        int m = 0;
        double frac = 0;
        double count=0;
        
        while (frac < 0.5)
        {
            count += times[m];
            frac = count/trials;
            System.out.println(m+1 + "   " +count + "   "+ frac);
            m++;
        }
                
                
        
    }
    
}

请帮助我,我越来越绝望了哈哈!祝大家 MLK 日快乐。

4

1 回答 1

0

该行始终为零,因为类型转换运算符的优先级高于乘法:

int rand = (int) Math.random() * n;

您需要使用括号:

int rand = (int) (Math.random() * n);
于 2021-01-19T19:34:30.087 回答