スポンサーリンク
※サイト運営にサーバーは必須です※
~ ロリポップ! はコスパのよい初心者向けサーバーです~
目次
はじめに
※追記:完成したアプリの紹介→同じ誕生日のペアがどのくらいいるかシミュレーション
ある数の集団の中に、同じ誕生日の人が何人いるかプログラムを使えばシミュレーションできそう。
プログラム自体の需要はあまりなさそうなので作らないが、方針だけは残しておく。
(ついでにいえば、自身のプログラム技術も高くない)
暇な時にチャレンジしたいので、そのための備忘録。
ひとまず、10月の祝日でプログラムをなんとか作成した
プログラムの中身を知りたい場合は次の記事に飛んでください
結果は以下の二つでまとめている
※この記事は、同じ誕生日の組がどれだけ存在するか?適当に見積もってみるの続きに相当
以下では、同じ誕生日の人がいた場合1組と数え、たとえ3人以上が同じ誕生日でも、1組とカウントするとする。
※C言語で実装することを考えている
プログラムをつくる方針
何人の集団ですかと尋ねて人数を入れる機能の実装
※作ったプログラムは、この機能は実装していない
あらかじめ365個の箱を用意(配列の宣言。int w[i]みたいな感じ)
配列の中身は、最初は全て0を入れておく。
(forなどのループ文を使い配列の中身を全部0にする)
※配列をゼロで初期化する場合は、わざわざfor文を使わず、int w[i]={0};みたいに処理することが可能
次に指定された人数分だけ、1~365までの乱数を生成
(ランダムの数の生成したあと365で割ったあまりを考える。いわゆるmod(365)で考える)
※作ったプログラムは、0~1の乱数を生成したあとに、365を掛けて乱数を作っている
乱数発生の際、対応する配列に対してカウントする(+=1)
※ループ文で、指定された数だけループを回し、カウントを行う
乱数を生成した後、配列の中の数が2以上の数字の場合のみ、同じ誕生日の組がいると判定(1~365までループを回す)
※作ったプログラムは、0~364の乱数
うるう年を考える場合はさらにひと手間がかかる。
365×4+1=1461の数字を考える。
1~1461の数を考え1461を特別扱いするより0~1460を生成して0を特別扱いする方が楽そう。(配列の中身を足し合わせる時にちょっと簡単になりそう)
0~1460まで配列を考え、最後に配列を中身を足し合わせる
例えば1番目の場合
1、366(365+1)、731(730+1)、1096(1095+1)を実質的に同じと考える
1番目の配列の中身に366、731、1096番目の中身を足し合わせる
w[i]= w[i]+ w[i+365]+ w[i+730]+ w[i+1095]みたいな感じでいけそう。
0番目は足し合わせなし。
※うるう年の例外として、「西暦年号が100で割り切れて400で割り切れない年は平年とする」というルールがあるが、そこまでは考えてくない
発展(グラフを作る)
最終的に、ある人数に対して、どれだけ同じ誕生日のペアがいるかグラフを作りたくなるかもしれない
人数(x軸)vs同じ誕生日の組の期待値(y軸)
この場合、上で一番最初に考えていた、「何人の集団ですかと尋ねて人数を入れる機能の実装」を取りやめる。
※作ったプログラムは、そもそもこの機能は実装していない
代わりに、最大のxを決める。つまり、どこまでの数の集団かを考える
そして期待値を正確に知りたいなら、上のプログラムの試行回数を増やす必要もある。
x=人数とy=誕生日のペアをdatファイルか何かで出力する。
必要なこと
- 書き込み用ファイルポインタの宣言
- fopenやfcloseなどのファイルを開く(閉じる)を設定
→(書き込み用ファイルポインタ)= fopen(“simulation.dat”,”w”); など - 設定した最大のxの値まで、ループ文を回して、対応するyを呼び出し書き込む
→fprintf(書き込み用ファイルポインタ, “%d\t%lf\n”,x,y[x]); など
出力したdatファイルは、gnuplotなどのグラフ作成ソフトを使って描写する
※エクセルでも描写可能
※以下の記事に結果をのせている
まとめ
※追記:完成したアプリの紹介→同じ誕生日のペアがどのくらいいるかシミュレーション
※続きの記事
※この記事は、同じ誕生日の組がどれだけ存在するか?適当に見積もってみるという記事の続に相当する
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。
コメント