コンテンツにスキップ

誕生日のパラドックス

誕生日のパラドックス

「何人集まれば、その中に誕生日が同一の2人(以上)がいる確率が、50%を超えるか?」

基本コード

まずは下のコードをProcessingに貼り付けて動かしてみよう

int hit = 0;
void setup(){
size(600, 400);
// 99人を集めて誕生日が同じ人がいるかチェック。いたら1を返す。いなければ0を返す。
hit = check(99);
}
void draw(){
background(0);
text(hit, width/2, height/2);
}
// ここから下はいじっちゃだめだぞ!!!!
// checkは人数を渡すと誕生日が同じ人がいたら「1」を返す。いなかったら「0」。
int check(int count){
int[] list = createBirthList(count);
for(int i=0; i<count; i++){
for(int j=i+1; j<count; j++){
if(list[i] == list[j]){
return 1;
}
}
}
return 0;
}
int[] createBirthList(int count){
int[] list = new int[count];
for(int i=0; i<count; i++){
int birth = (int)random(1, 366);
list[i] = birth;
}
return list;
}

やってみよう

「23人集まれば、誕生日が同じ人がいる確率が50%を超える」らしい。

本当だろうか?

プログラムを実行して確認してみよう!

23人集めて同じ誕生日の人がいたかチェックする

void setup(){
size(600, 400);
hit = check(23);
}

check(23) とすることでランダムで23人を集めて同じ誕生日の人がいたかチェックできるぞ。 もしいたら「1」を、いなかったら「0」を返す。 返ってきた「1」か「0」を、変数hitに入れてあげよう。

  • 画面上に「1」と表示されたら同じ誕生日の人がいたことになる。
  • 画面上に「0」と表示されたら同じ誕生日の人はいなかったことになる。

10回実行してみよう

10回中、「1」が表示されたのは何回あったかな? そして確率は何%と言えるかな?

100回実行してみよう

え?100回も実行してらんない?

じゃあどうしようかな?

プログラムを修正してみよう!

1万回実行してみよう

ふふ。

80%を超えるのは何人のときかな?


90%を超えるのは何人のときかな?


99%を超えるのは何人のときかな?


自分の学校のクラスで同じ誕生日がいる人の確率は?