2017-08-30 11 views
0

私はJavascriptで23人の生徒の誕生日パラオイベントをやろうとしましたが、平均確率は51%になるはずです。ここにコード:私の誕生日のパラドックスイベントシミュレータはうまくいきません

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%の目標を上回っていたからです。 (私はそれを数回走らせた)。あなたの助けをもう一度ありがとう、私は何が間違っているか把握しようとしている時間があったが、私はそれを得ることができない。

答えて

1

あなたはすべて偶然、ない少なくとも一つの偶然の一致が部屋であるケースの数をの数を数えます。つまり、あるセットに、誕生日を共有するような3人の人、または誕生日を共有する2ペアの人がいる場合は、Dを2回増やします。

break;D++;の後に追加すると、約50%の数字が得られます。ところで

は、あなたのvループは(v=0で、あなたはnpers[0]に対してnpers[-1]を比較)npersをunderindexes - それは、結果には影響しません。

+0

ありがとうございました。 –

0

問題は、あなたがペアを見つけたときに一度だけ、それをインクリメントする代わりに、トライアル内のすべてのペアのために、このforループ

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

これは増分しますD(成功数)です。あなたはペアの存在だけを気にします。 D++;の後にbreak;を挿入するとこれが解決されます。

-1
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 = 1; v < npers.length; v++) {//start from 1 
     if (npers[v-1] == npers[v]) { 
      D++; 
      break;// to avoid counting when there are more than 2 persons 
    //having the same birthday. It should count as 1. 
     } 
    } 
    pers = []; 
} 

D = D/100; 
var DD = D.toString(); 
DD = DD + "%"; 
document.write(DD); 
関連する問題