我试图用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增加两次。

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

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

10-02 13:10