スポンサーリンク
※サイト運営にサーバーは必須です※
~ ロリポップ! はコスパのよい初心者向けサーバーです~
目次
はじめに
※追記:完成したアプリの紹介→同じ誕生日のペアがどのくらいいるかシミュレーション
プログラムの勉強の一環で作成した誕生日関連のシミュレーションソフト。無料で使用できる。
(ぶっちゃけ、素人が作ったソフトなのでお金をとっても仕方がない。その上、勉強すればすぐに作れるソフトなので……)
「R_generator」(乱数生成ソフト)に引き続いて、安っぽい素人ソフト第二弾目。
※いずれ、アプリとして、移植したいと考え中。
作った手順はVisual Studio を使ってフリーソフトを作る(アイコンの調達)などを参照
「Birthday_Simulator」にできること(特徴)
- 誕生日にまつわる色々な問題をモンテカルロシミュレーションに基づいて、計算できる
- うるう年を含む場合と含まない場合の両方を計算可能。
- 無料で使用可能
- 使用したフレームワークは.NET Framework4.5.2
例えば、以下のようなことを知ることができる
100人の中に同じ誕生日の組は何組いるか?
→11.35323組
自分を含めて、100人の集団で、自分と同じ誕生日の人が自分を含めて3人以上いる確率
→2.76%
1000人の中にうるう年の人間が4人以上いる確率
→0.56%
誕生日問題の実感
22人から23人の集団になると時、同じ誕生日の組がいる確率が50%を超える。
この数字は直観よりも大きく感じることが多い。
この場合、22人の集団に対して、自分と同じ誕生日の人がいる確率を考えてしまいがちだから。22人の集団(自分を含めて23人の集団)に対して、自分と同じ誕生日の人がいる確率は、5.85%程度しかない。
22人の中に同じ誕生日の組がいる確率→47.6041%
23人の中に同じ誕生日の組がいる確率→50.7431%
22人の集団に対して、自分と同じ誕生日の人がいる確率→5.8591%
「Birthday_Simulator」で使用しているアルゴリズム
はじめに、365(うるう年を含める場合は366)の配列を用意
その後、1~365の乱数を集団の人数分だけ振る。
例えば1の数字が出たら、1/1(1日目)に誕生日を持つ人がいると考えている。
うるう年の場合は、1~365.25までの乱数を振って、365~365.25の範囲に入った場合にカウントするようにしている。
このソフトを作る際に、以前書いた誕生日用のシミュレーションコードを参照している。詳しくは誕生日の組を求めるプログラム (c++/c言語)の記事で紹介
※うるう年の処理の仕方が微妙に違うが基本的な流れは同じ。
※このソフトはC#で書いているが、リンク先のコードはC(C++)言語に対応
「Birthday_Simulator」を使用する上での注意点
「Birthday_Simulator」で算出する値は、乱数を用いた数値的に算出している。解析的な答えではないので、誤差が存在する。
オバーフローに注意。(試行回数)×366[うるう年]が2,147,483,647(intの範囲)を超えるとオバーフローする危険性がある。
※要望があれば、intからlongに書き換える
誤差を少なくするためには、試行回数を増やさないといけない。しかし、試行回数を増やすと、処理が終わるまでの時間が長くなる。時間のかかる処理を走らせている時に、無理やり「Birthday_Simulator」を閉じたり、前の画面に戻ろうとすると、プログラムが停止する。※私のようなせっかちな人間は注意
※今どれくらい処理が終わったか表示する機能はない。試行回数を10倍にすると、プログラムの処理が終わる時間もおよそ10倍になる。そこで、まずは、試行回数を少なめにして、計算する。結果の出力ファイルの一番最後に、どれだけ時間がかかったか記録される。この測定時間をもとに、どれだけ、処理に時間がかかるか見積もることができる。
※「人数vs確率」シミュレーションはデフォルトの値(2~100人の集団に対して1万回計算)で、私のパソコンで計算したところ、1.8秒かかった。ガチの精度がいる場合は100万回ぐらいしないと信用できない。1万回ぐらいだと、人数が増えているのに期待値や確率の値が小さくなるという事態がたまに起こる。とはいえ100万回回すのに単純計算で180秒(3分)も待たないといけない。
アイコン
『ICOON MONO』のアイコン素材をPOV-Rayというソフトを使った青色の半透明の球体に貼り付けている。
『ICOON MONO』でダウンロードした素材
球体に貼り付けてできたアイコン
※初見だと何が元なのかわからないだろう。フリー素材をそのまま使うよりは安っぽさが消えたと思う。
「R_generator」のアイコンを作った時とほぼ同じ手順を踏んでいる。
POV-Rayでアイコンを作る手順はPOV-Rayでアイコンを作ってみた(無料)で公開
使い方
ファルダの中の「Birthday_Simulator.exe」をクリックすればよい
クリックすると次のような画面がでる。
5つのシミュレーションモードが存在するので、どれか1つ選ぶ。下に行くほど時間のかかる処理をしている。
個別シミュレーション(試行回数1)
試行回数が1回なので、このシミュレーションの需要はほぼないと思う。期待値シミュレーション以降のシミュレーションは、この個別シミュレーションを何度も回しているので、動きの確認用としての意味合いが強い。
期待値シミュレーション(試行回数指定可)
個別シミュレーションを複数回行い、ある数の集団の中、同じ誕生日の組は何組いるかを計算。個別シミュレーションの上位版。
確率シミュレーション(試行回数指定可)
個別シミュレーションを複数回行い、ある数の集団の中、同じ誕生日の組は何組いるかを計算。また、それにまつわる確率も計算。期待値シミュレーションの上位版。
人数vs期待値(指定した人数の範囲で期待値シミュレーションを行う)
期待値シミュレーションを複数回行う。期待値シミュレーションではできなかった、集団の人数の範囲指定ができる。人数vs同じ誕生日の組(期待値)をプロットする際に有用。期待値シミュレーションの上位版。
人数vs確率(指定した人数の範囲で期待値シミュレーションを行う)
確率シミュレーションを複数回行う。確率シミュレーションではできなかった、集団の人数の範囲指定ができる。人数vs確率をプロットする際に有用。確率シミュレーションと人数vs期待値の上位版に相当。
ここでは、「人数vs確率」をクリックして、次に進んだとする。次のような画面が現れる。
集団の人数:現在考えている集団の人数を指定(2以上の整数を指定)
シミュエーションの試行回数:個別シミュエーションを行う回数。デフォルトでは1万回になっている。誤差を少なくしたいなら、試行回数を増やす必要がある。時間がかかるようなら減らす。
うるう年:「含む」か「含まない」か選択することができる。
同じ誕生日の人が「x」人以上いる時、1組とカウント:特別な理由がないのであれば2のままにする。特殊な状況でなければ、2人いれば、同じ誕生日のペアが1組あるとカウントすると思われる。例えば、100人の中に3人が同じ誕生日の確率を求めたいのであれば2でなく3にする必要が出てくる。
同じ誕生日の組が「x」組いる時の確率を求める:例えば、100人の中に同じ誕生日の組が10組以上いる確率を知りたい場合は「x」を「10」にする。
実行ボタンを押すと、計算が実行される。
※計算量が多い場合はそこそこ待たないといけない
終わると、結果がtxtファイルとして自動的に出力される。ファイルの名前は条件に対応して自動的に設定される。
右側の窓で結果をすぐに表示してくれる。
ダウンロードの仕方
Birthday_Simulator←のボタンを押すとダウンロードが開始される。
※Vectorからもダウンロードができるようになった
→http://www.vector.co.jp/soft/winnt/edu/se515133.html?ds
※このボタンを押すと、chromeなどで誤ブロックされる可能性がある。Chromeの使用者で、ダウンロードしたい場合は、「破棄」の部分を「継続」に変えるとダウンロードが続行される。
Windowsユーザーの場合「ダウンロード」のフォルダの中に、このファイルがダウンロードされる。
ダウンロードした後、zipファイルを解凍する。(解凍ソフトを持ていない場合は、解凍用のフリーソフトが必要。フリーの解凍ソフトでは、「Lhaplus」というソフトが有名。私も使用している)
免責
このソフトを利用した事で生じたいかなる不利益を私は一切の責任を負わない。
自己の責任の上で使用して下さい。
(このソフトで不利益を被る事態を作者はあまり想像できないが……)
権利について
常識的な範囲で使っていたら特に問題は起こらないが、一応明記しておく。
「Birthday_Simulator」の著作権は私に属している。(著作権までは放棄していない)
個人間での再配布は自由にして問題ない。
※例:友人にファイルをコピーして渡すのはOK
ただし、組織的に、あるいは大規模に、再配布する場合は一応メールをください。ここで、組織的な(大規模な)再配布とは、不特定多数に配布される可能性がある場合のことを指す。万が一、メールをしたい場合は、このサイトのコメント欄からこのサイト主とコンタクトをとることができる。
禁止行為
- 「Birthday_Simulator」を有料で再配布。(あるいは何か別のものを抱き合わせて有料で配布)
- 再配布する際、「Birthday_Simulator」をあたかも自分で作ったかのような表現をする。(あるいはそう誤認されうる表現をする)
関連記事
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。
コメント