生日概率:输出错误

时间:2016-07-08 04:57:05

标签: java random

下面的代码应该生成一年中的随机日期,并且每2个生日相同的人进行匹配。这被称为生日问题。代码有效但输出错误。

public double simulate(int size, int count) {

    Random random = new Random();

    double x[] = new double[size];

    double matches = 0;

    boolean isMatch = false;

    random.setSeed(count);

    for (int i = 0; i < count; i++) {

        for (int j = 0; j < size; j++) {

            x[j] = random.nextInt(365);

            for (int k = j + 1; k < size; k++) {

                if (x[j] == x[k]) {

                    matches++;

                    isMatch = true;

                    break;
                }
            }
            if (isMatch) {

                isMatch = false;
                break;
            }
        }
    }
    return (matches/count)*100;
}

,这是预期的输出结果

 simulate(number of people,number of simulation)
 simulate(5, 10000) output = 2.71
 simulate(7, 5000)  output = 5.34 
 simulate(2, 10000) output = 0.27 
 simulate(9, 10000) output = 9.47 
 simulate(30, 20000) output = 70.675
 simulate(15, 50000) output = 25.576
 simulate(35, 50000) output = 81.434
 simulate(45, 50000) output = 94.2

这就是实际输出:

     simulate(5, 10000) output = 2.54
     simulate(7, 5000)  output = 5.64 
     simulate(2, 10000) output = 0.18
     simulate(9, 10000) output = 9.05
     simulate(30, 20000) output = 68.98
     simulate(15, 50000) output = 25.12
     simulate(35, 50000) output = 79.90
     simulate(45, 50000) output = 92.99
谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

您的代码中存在一个大问题。您正在使用随机数据初始化数组x,但在完全初始化之前,您已经在检查是否有两个相同的值。此时,数组的末尾尚未完全初始化。将其更改为:

        // First fully filly the array x with values
        for (int j = 0; j < size; j++) {
            x[j] = random.nextInt(365);
        }

        // And then go checking for duplicates
        for (int j = 0; j < size; j++) {
            // etc.

之后,您的结果将更接近预期输出,但仍然不完全相同。这可能与随机种子的确切值有关。