0

我尝试在 Javascript 中为 23 名学生做一个生日悖论事件,它应该给我 51% 的平均概率,但它总是给我大约 67% 的数字。这里的代码:

var pers = [];
var D = 0;
for (var i = 0; i < 10000; i++) {
    for (var k = 0; k < 23; k++) {
        pers.push(Math.floor((Math.random()*366) + 1));
    }
    var npers = pers.slice();
    npers.sort();
    for ( var v = 0; v < npers.length; v++ ) {
        if (npers[v-1] == npers[v]) {
            D++;
        }
    }
    pers = [];
}
D = D / 100;
var DD = D.toString(); 
DD = DD + "%";
document.write(DD);

请你告诉我我在哪里犯了错误?非常感谢。我确信我犯了一个错误,因为我得到的最低百分比是 66%,远高于 51% 的目标。(我已经运行了几次)。再次感谢您的帮助,我已经好几个小时试图弄清楚我做错了什么,但我无法理解。

4

2 回答 2

1

你计算的是所有巧合的数量,而不是房间里至少有一个巧合的案例数量。也就是说,如果在给定的集合中,例如,三个人共享一个生日,或者有两对共享生日的人,则增量D两次。

添加一个break;之后D++;,你会得到大约 50% 的数字。

顺便说一句,您的v循环索引不足npers(在v=0,您与 进行比较npers[-1]npers[0]-但这不会影响结果。

于 2017-08-30T17:44:06.433 回答
0

问题在于这个for循环

for ( var v = 0; v < npers.length; v++ ) {
    if (npers[v-1] == npers[v]) {
        D++;
    }
}

这将为试验中的每一对增加 D(成功次数),而不是在找到一对时增加一次。你只关心一对的存在。插入break;之后D++;应该可以解决这个问题。

于 2017-08-30T17:44:21.547 回答