プログラマメモ2 - programmer no memo2

誕生日の一致:ランダムに%d人を集めた%d部屋では、%d部屋で誕生日の一致がありました。%n 2008/03/08

誕生日の一致の謎

ランダムにX人を集めた部屋で、どれだけの確率で誕生日の一致がおこるのか?


一年をとりあえず365日と考えて、みました。

まず、コンピュータ上で再現。
乱数を使っているので実行しているので、下記の結果はかならずしも再現しませんが、おおむねこんな感じ。

参考にした本によると、23人以上では同じ誕生日の人がいる確率は50%をこえているそうです。

誕生日の一致:ランダムに2人を集めた10部屋では、0部屋で誕生日の一致がありました。
誕生日の一致:ランダムに3人を集めた10部屋では、0部屋で誕生日の一致がありました。
誕生日の一致:ランダムに4人を集めた10部屋では、0部屋で誕生日の一致がありました。
誕生日の一致:ランダムに5人を集めた10部屋では、0部屋で誕生日の一致がありました。
誕生日の一致:ランダムに6人を集めた10部屋では、1部屋で誕生日の一致がありました。
誕生日の一致:ランダムに7人を集めた10部屋では、0部屋で誕生日の一致がありました。
誕生日の一致:ランダムに8人を集めた10部屋では、1部屋で誕生日の一致がありました。
誕生日の一致:ランダムに9人を集めた10部屋では、1部屋で誕生日の一致がありました。
誕生日の一致:ランダムに10人を集めた10部屋では、0部屋で誕生日の一致がありました。
誕生日の一致:ランダムに11人を集めた10部屋では、1部屋で誕生日の一致がありました。
誕生日の一致:ランダムに12人を集めた10部屋では、3部屋で誕生日の一致がありました。
誕生日の一致:ランダムに13人を集めた10部屋では、1部屋で誕生日の一致がありました。
誕生日の一致:ランダムに14人を集めた10部屋では、3部屋で誕生日の一致がありました。
誕生日の一致:ランダムに15人を集めた10部屋では、1部屋で誕生日の一致がありました。
誕生日の一致:ランダムに16人を集めた10部屋では、1部屋で誕生日の一致がありました。
誕生日の一致:ランダムに17人を集めた10部屋では、5部屋で誕生日の一致がありました。
誕生日の一致:ランダムに18人を集めた10部屋では、6部屋で誕生日の一致がありました。
誕生日の一致:ランダムに19人を集めた10部屋では、3部屋で誕生日の一致がありました。
誕生日の一致:ランダムに20人を集めた10部屋では、2部屋で誕生日の一致がありました。
誕生日の一致:ランダムに21人を集めた10部屋では、5部屋で誕生日の一致がありました。
誕生日の一致:ランダムに22人を集めた10部屋では、6部屋で誕生日の一致がありました。
誕生日の一致:ランダムに23人を集めた10部屋では、3部屋で誕生日の一致がありました。
誕生日の一致:ランダムに24人を集めた10部屋では、5部屋で誕生日の一致がありました。
誕生日の一致:ランダムに25人を集めた10部屋では、6部屋で誕生日の一致がありました。
誕生日の一致:ランダムに26人を集めた10部屋では、4部屋で誕生日の一致がありました。
誕生日の一致:ランダムに27人を集めた10部屋では、6部屋で誕生日の一致がありました。
誕生日の一致:ランダムに28人を集めた10部屋では、7部屋で誕生日の一致がありました。
誕生日の一致:ランダムに29人を集めた10部屋では、9部屋で誕生日の一致がありました。
誕生日の一致:ランダムに30人を集めた10部屋では、8部屋で誕生日の一致がありました。
誕生日の一致:ランダムに31人を集めた10部屋では、6部屋で誕生日の一致がありました。
誕生日の一致:ランダムに32人を集めた10部屋では、7部屋で誕生日の一致がありました。
誕生日の一致:ランダムに33人を集めた10部屋では、8部屋で誕生日の一致がありました。
誕生日の一致:ランダムに34人を集めた10部屋では、8部屋で誕生日の一致がありました。
誕生日の一致:ランダムに35人を集めた10部屋では、8部屋で誕生日の一致がありました。
誕生日の一致:ランダムに36人を集めた10部屋では、7部屋で誕生日の一致がありました。
誕生日の一致:ランダムに37人を集めた10部屋では、8部屋で誕生日の一致がありました。
誕生日の一致:ランダムに38人を集めた10部屋では、8部屋で誕生日の一致がありました。
誕生日の一致:ランダムに39人を集めた10部屋では、10部屋で誕生日の一致がありました。
誕生日の一致:ランダムに40人を集めた10部屋では、9部屋で誕生日の一致がありました。
誕生日の一致:ランダムに41人を集めた10部屋では、10部屋で誕生日の一致がありました。
誕生日の一致:ランダムに42人を集めた10部屋では、10部屋で誕生日の一致がありました。
誕生日の一致:ランダムに43人を集めた10部屋では、10部屋で誕生日の一致がありました。
誕生日の一致:ランダムに44人を集めた10部屋では、10部屋で誕生日の一致がありました。
誕生日の一致:ランダムに45人を集めた10部屋では、10部屋で誕生日の一致がありました。
誕生日の一致:ランダムに46人を集めた10部屋では、9部屋で誕生日の一致がありました。
誕生日の一致:ランダムに47人を集めた10部屋では、10部屋で誕生日の一致がありました。
誕生日の一致:ランダムに48人を集めた10部屋では、9部屋で誕生日の一致がありました。
誕生日の一致:ランダムに49人を集めた10部屋では、10部屋で誕生日の一致がありました。
誕生日の一致:ランダムに50人を集めた10部屋では、9部屋で誕生日の一致がありました。


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;

public class YourBirthDay {

public static void main(String[] args) {
int n = 2;
int COUNT = 10;
for(int i=n;i<51;i++){
test(i, COUNT);
}
}

static void test(int n, int COUNT) {
int countOfCoincidence = 0;
// System.out.println(room);
for (int i = 0; i < COUNT; i++) {
Room room = new Room(n);
sort(room.persons);
// System.out.println(room);
if (whatACoincidence(room.persons))
countOfCoincidence++;
}
System.out.printf("ランダムに%d人を集めた%d部屋では、%d部屋で誕生日の一致がありました。%n", n,
COUNT, countOfCoincidence);
System.out.printf("確率:%f%n", calculationOfProbability(n));

}

/**
* <p>
* 部屋にいる人の数から誕生日が一致する確率を求めます。<br>
* 一年を365日として考えます。
* </p>
*
* @param n 部屋にいる人の数
* @return
*/
static double calculationOfProbability(int n){
double d = 365d;
double p = 1.0;
n = n - 1;
for(int i= 1;i<=n;i++){
p *= (d-i)/d;
}
//System.out.println(p);
return 1d - p;
}

static void sort(List<Person> list) {
Collections.sort(list, new Comparator<Person>() {
public int compare(Person o1, Person o2) {
return new Integer(o1.birthDay).compareTo(new Integer(
o2.birthDay));
}
});
}

static boolean whatACoincidence(List<Person> list) {
for (int i = 1; i < list.size(); i++) {
if (list.get(i - 1).birthDay == list.get(i).birthDay) {
return true;
}
}
return false;
}

static class Person {
int birthDay;
String name;

public Person(String name) {
this.name = name;
this.birthDay = random();
}

public String toString() {
return String.format("name:[%s] birthday:[%s]", name, birthDay);
}

}

static class Room {
List<Person> persons = new ArrayList<Person>();

public Room(int n) {
for (int i = 0; i < n; i++) {
persons.add(new Person("" + i));
}
}

public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(persons);
return new String(builder);
}
}

static int random() {
return new Random().nextInt(365);
}
}

: