我在 javascript 中的生日悖论事件模拟器运行不正常

My birthday paradox event simulator in javascript is not working well

我试图在 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% 的目标。 (我已经 运行 好几次了)。再次感谢您的帮助,我花了几个小时试图弄清楚我做错了什么,但我无法理解。

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

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

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

这个for循环有问题

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

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