同じ誕生日のペアがどのくらいいるかシミュレーション

  • このエントリーをはてなブックマークに追加

スポンサーリンク

※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~

目次

はじめに

「同じ誕生日のペアがどのくらいいるかシミュレーション」という名前のAndroidアプリをリリースした。

内容的には、Windows用に以前作った「Birthday_Simulator」とほぼ同じ。

「Birthday_Simulator」という名前がイマイチな気がしたので、アプリの名前を変えた。

少し名前が長ったらしい気もするが、意味が伝わらないよりましだろう……

※「Birthday_Simulator」のダウンロードページは、誕生日シミュレーションソフト「Birthday_Simulator」(無料)

「同じ誕生日のペアがどのくらいいるかシミュレーション」(Google Play のアプリ紹介ページ):https://play.google.com/store/apps/details?id=com.kaen.birthday_simulator&hl=ja

何ができるの?

同じ誕生日のペアがどのくらいいるかシミュレーションすることができる。

計算にはモンテカルロ法を用いている。

うるう年を含む場合と含まない場合の両方を計算可能。

例えば、以下のようなことを知ることができる

100人の中に同じ誕生日の組は何組いるか?→約11.35323組

自分を含めて、100人の集団で、自分と同じ誕生日の人が自分を含めて3人以上いる確率→約2.76%

※このアプリは、乱数を用いた数値的に算出している。解析的な答えではないので、誤差が存在する。

実行するとこんな感じの画面になる

一応、英語対応させている。

英語の方の名前は「Same Birthday Pairs Simulator」

※英語の成績が芳しくなかった私が、Google翻訳を駆使しながら、適当に英訳。ミススペルや文法的なミスがゴロゴロありそう。

説明書

アプリに添付している説明書を一応ここにも載せておく

[このアプリでできること]

 同じ誕生日のペアがどのくらいいるかシミュレーションすることができる。

 計算にはモンテカルロ法を用いている。

 うるう年を含む場合と含まない場合の両方を計算可能。

 例えば、以下のようなことを知ることができる

 100人の中に同じ誕生日の組は何組いるか?→約11.35323組

 自分を含めて、100人の集団で、自分と同じ誕生日の人が自分を含めて3人以上いる確率→約2.76%

[使用上の注意点]

 このアプリは、乱数を用いた数値的に算出している。解析的な答えではないので、誤差が存在する。

 オバーフローに注意。大きすぎる数字を扱うとアプリが止まる危険性がある。

 このアプリの作成にはUnityを使用している。Unityの仕様の関係上、1万5千字を超える文字列を一遍に扱えない。
 そのため、下窓に表示される計算結果は、1万4千字を超えた時点で、表示を打ち止めするようにしている。

 誤差を少なくするためには、試行回数を増やさないといけない。しかし、試行回数を増やすと、処理が終わるまでの時間が長くなる。

※今どれくらい処理が終わったか表示する機能はない。試行回数を10倍にすると、プログラムの処理が終わる時間もおよそ10倍になる。
 そこで、まずは、試行回数を少なめにして、計算する。結果の一番後ろに、どれだけ時間(Time)がかかったか記録される。この測定時間をもとに、どれだけ、処理に時間がかかるか見積もることができる。

[アルゴリズム]

 はじめに、365(うるう年を含める場合は366)の配列を用意する。

 その後、1~365の乱数を集団の人数分だけ振る。

 例えば1の数字が出たら、1/1(1日目)に誕生日を持つ人がいると考えている。

 うるう年の場合は、1~365.25までの乱数を振って、365~365.25の範囲に入った場合にカウントするようにしている。

※より正確に言えば、振っている乱数は1~365(365.25)でなく、1~366(366.25)である。生成した実数の乱数が1以上2未満(切り捨てして1になる場合)に1と判定しているため。

※うるう年の処理の仕方が微妙に違うが、私の運営するホームページにシミュレーションコードを置いてある。このソフトはC#で書いているが、ホームページで書いているソースコードはC(C++)言語に対応。

[モードの説明(共通部)]

 5つのシミュレーションモードが存在するので、どれか1つ選ぶ。下に行くほど時間のかかる処理をしている。

1:個別シミュレーション(試行回数1)

 試行回数が1回なので、このシミュレーションの需要はほぼないと思う。期待値シミュレーション以降のシミュレーションは、この個別シミュレーションを何度も回しているので、動きの確認用としての意味合いが強い。

 366日目がうるう年に対応していると考えている。

 条件aで指定した人数より多い場合、Trueと表示される。

2:期待値シミュレーション(試行回数指定可)

 個別シミュレーションを複数回行い、ある数の集団の中、同じ誕生日の組は何組いるかを計算。個別シミュレーションの上位版。

3:確率シミュレーション(試行回数指定可)

 個別シミュレーションを複数回行い、ある数の集団の中、同じ誕生日の組は何組いるかを計算。また、それにまつわる確率も計算。期待値シミュレーションの上位版。

 うるう年を含む場合、「試行回数」「同じ誕生日のペア」「真偽(ペア)」「1/1の人数」「真偽(1/1)」「2/29の人数」「真偽(2/29)」の7つの項目が表示される。

・「真偽(ペア)」:「同じ誕生日のペア」が条件bで指定された組より多かった場合、True。

・「1/1の人数」:1/1に誕生日を持つ人数

・「真偽(1/1)」:「1/1の人数」が条件aで指定された人数より多かった場合、True。

 「2/29の人数」「真偽(2/29)」も1/1の場合と同様に考える。

4:人数vs期待値(指定した人数の範囲で期待値シミュレーションを行う)

 期待値シミュレーションを複数回行う。期待値シミュレーションではできなかった、集団の人数の範囲指定ができる。人数vs同じ誕生日の組(期待値)をプロットする際に有用。期待値シミュレーションの上位版。

5:人数vs確率(指定した人数の範囲で期待値シミュレーションを行う)

 確率シミュレーションを複数回行う。確率シミュレーションではできなかった、集団の人数の範囲指定ができる。人数vs確率をプロットする際に有用。確率シミュレーションと人数vs期待値の上位版に相当。

 「人数」「同じ誕生日のペア(期待値)」「ペアのいる確率(%)」「1/1のペア確率(%)」「自分と同じ誕生日の確率(%)」「2/29のペア確率(%)」「自分と同じ誕生日の確率(2/29)(%)」の7つの項目が表示される。

 何を意味しているか分かりづらい場合は、「3:確率シミュレーション」を実行してみる。「5:人数vs確率」は、人数を変えながら、「3:確率シミュレーション」の最終結果を表示しているようなもの。

 「同じ誕生日のペア(期待値)」:ある人数の集団において、同じ誕生日のペアの組がどれだけいるか期待値を算出

・「ペアのいる確率(%)」:ある人数の集団において、条件bで指定した以上の組が存在する確率。

・「1/1のペア確率(%)」:ある人数の集団において、1/1に誕生日を持つ人が条件aで指定した人数以上いる確率。

・「自分と同じ誕生日の確率(%)」: ある人数の集団に対して、自分と同じ誕生日の人が自分を含めて(条件aで指定した人数)以上いる確率。1月1日(1日目の人数)に同じ誕生日の人数が(条件aで指定した人数-1)人以上いる状況を考えて判定している。

・「2/29のペア確率(%)」:ある人数の集団において、うるう年の人が条件aで指定した人数以上いる確率。

・「自分と同じ誕生日の確率(2/29)(%)」:ある人数の集団に対して、自分がうるう年に生まれていると仮定して、自分を含めて(条件aで指定した人数)以上いる確率。2月29日に同じ誕生日の人数が(条件aで指定した人数-1)人以上いる状況を考えて判定している。

[条件の指定]

 条件が不適当だった場合、自動修正される。

・人数:現在考えている集団の人数を指定(2以上の整数を指定)

・試行回数:個別シミュエーションを行う回数。デフォルトでは千回になっている。誤差を少なくしたいなら、試行回数を増やす必要がある。時間がかかるようなら減らす。(1以上の整数を指定)

・うるう年:「含む」か「含まない」か選択することができる。

・条件a「同じ誕生日の人が「x」人以上いる時、1組とカウント」:特別な理由がないのであれば2のままにする。特殊な状況でなければ、2人いれば、同じ誕生日のペアが1組あるとカウントすると思われる。例えば、100人の中に3人が同じ誕生日の確率を求めたいのであれば2でなく3にする必要が出てくる。(2以上の整数を指定)

・条件b「同じ誕生日の組が「x」組いる時の確率を求める」:例えば、100人の中に同じ誕生日の組が10組以上いる確率を知りたい場合は「x」を「10」にする。(1以上366以下の整数を指定)

[その他注意事項]

 期待値シミュレーション及び確率シミュレーションのモードを選択して、試行回数を1万回にした場合、500~800回程度で表示が途切れる。これは、表示できる文字数の制約が1万5千字であるからだ。ただし、最終的な結果は、きちんと1万回計算したものが出力される。その点は、安心してもらいたい。

[対応プラットフォーム]

 出力した結果をテキストファイルに保存する機能は、残念ながらこのソフトにはついていない。その代りと言っては何だが、Windows上で動くフリーソフトを用意してある。名前は「Birthday_Simulator」。
 アプリの紹介ページで、私のホームページへのリンクがあるはずなので、そこからたどることができる。

関連記事

※「同じ誕生日のペアがどのくらいいるかシミュレーション」(Google Play のアプリ紹介ページ):https://play.google.com/store/apps/details?id=com.kaen.birthday_simulator&hl=ja

 

~Webサイトを自分で作ってみませんか?~

Webサイトを運営するにはサーバーが必須です。
このサイトは、エックスサーバー のサーバーを使用しています。
エックスサーバーは無料で10日間お試しができます。

     

コメント

コメントを残す

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)