下面的代码应该生成一年中的随机日期,并且每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
谢谢你的时间。
答案 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.
之后,您的结果将更接近预期输出,但仍然不完全相同。这可能与随机种子的确切值有关。