課題11
ランダムウォーク
次のように,0回めのところに初期値を設定した後,1回め2回めと賭けをする.買ったら+1万円,負けたら-1万円として50回めまで累算するようなシミュレーションを行う.ただし,一度破産したら,すなわち0円になったら次回以降は0円のままで終了する.逆に10万円になったら,胴元が負けたとしてそれ以降賭けを行わず,10万円のままとする.勝負は50回とすると,ほとんどの場合で結果は0円か10万円となり勝負がつく.それ以外の場合はまだ勝負がついてない状態である.
これを実現するためには,まず次のようなシート(名前が「コイントス」)を用意しよう.
ギャンブラー | 1回 | 2回 | … | 50回 |
---|---|---|---|---|
1 | 1-1 | -1 | -1 | |
2 | -11 | 1 | 1 | |
100 | -1-1 | 1 | -1 |
この「コイントス」シートは,B2セルに
「=if(RAND()>0.5,1,-1)」
と入力し,全部のセルにコピーする.RAND()というのは乱数を生成するための関数で,呼び出される度にサイコロの出目を計算するようにランダムな数値(0から1の範囲)を算出する.これを使用してあたかもサイコロを振ったかのように出目をシミュレートし,それが0.5よりも大きいか小さいかで1か-1のどちらか一方になるようにしている.これによりコインの表が出て1万円になったか,裏が出て-1万円になったかをシミュレーションする.
このシートは,1回めのコイントスから50回めのコイントスを一行に書いておく.さらに,このコイントスの行を例えば100行コピーすることで,100人分のギャンブラーをシミュレーションすることができる.
次に,「コイントス」シートの結果を集計するシート「1」を用意する.
初期額 | 1回 | 2回 | … | 50回 | 勝った人数 | 負けた人数 | 未確定な人数 |
---|---|---|---|---|---|---|---|
1 | 23 | 2 | 0 | ||||
1 | 00 | 0 | 0 | ||||
1 | 23 | 4 | 10 |
このシートでは,A2セルが初期値であるので,B2セルに,
「=IF(A2=0,0,IF(A2>=10,10,A2+$コイントス.B2))」
と入れればよい.後は同様の式を全体にコピーすればシートが完成する.
この式は,A2に入っている現在の金額が,0円なら0,10万円なら10,と上限下限を決めている.そうでない場合に,一回前の金額に「コイントス」シートのB2セルにあるコイントスの結果に応じて+1するか-1したものを次の金額とするための式である.
また,「勝った人数」のところには,勝った人の数を計算させる.
「=countIF(AY2:AY101, 10)」
countIF関数は,指定した範囲内で,指定した数字の,数を数える関数である.ここでは10の数を数えることで10万円に到達した「勝った人」の数を数えている.同様に「負けた人の数」は
「=countIF(AY2:AY101, 0)」
まだ勝負が決まっていない「未確定な人」は
「=100-勝った人の数-負けた人の数」
最後に,別シートに初期値を変化させたもの(2から9)まで用意し,勝率と勝負のつくまでの回数を比較する.
この上で,次を考察してみよう.
- 理論式とシミュレーションによる勝率はあっているか.
- 理論式とシミュレーションによる勝負がつくまでの回数はあっているか.
提出方法
今回は提出しなくてよい.次回レポートとして結果をまとめてもらう予定である.