乱数・順位戦B型の解説


シートmで入力された内容に基づき、シートcで計算を行っている。

以下ではシートcでの処理内容を順に説明する。
なお、「順位」という言葉がリーグ開始時のものか、リーグ戦の結果決まるものかがわかりにくいので、後者については「当期順位」と明示することで混乱を避けている。

Excelの反復計算機能を使っているため、計算順序には留意する必要がある。
 A1→B1→C1→…→A2→B2→C2→…
の順で計算が行われるので、この点を意識していないと思ったような結果が得られないことがある。

・1行目 フラグ
 シートmのセルA1の値をそのまま持ってきている。0はリセット、1が試行である。
 以下の記述を見てもらえればわかるが、0がセットされている場合には、値が初期値に戻り、そのままの状態となるので、2回反復計算を行うとExcelは処理が終了(つまり「計算が収束した」)と判断するので、その時点で実行を終了する。
 ただし、細かい話だが、同時に開いているExcelシートがあってそちらで再計算が実行されていると、計算を継続してしまうので指定された試行回数だけリセットを繰り返すので注意を要する。

・2行目 試行回数
 フラグが1ならば、反復計算が行われるごとに1ずつ加算される。
 フラグが0ならば、0にリセットされる。

・3~5行目 棋士/期待勝率
 シートmから棋士名と期待勝率を持ってきている。 

・6行目 乱数
 rand関数を使い0~1までの数値をランダムに発生させる。
 (rand関数で発生する乱数rは、正確には0≦r<1であるが実用上問題は無い)

・7行目 勝者
 6行目で得られた乱数を使い、勝者を設定する。
   乱数<期待勝率 ならば 先手勝ちとして、7行目に3行目の先手棋士名をセット
   乱数≧期待勝率 ならば 後手勝ちとして、7行目に4行目の後手棋士名をセット

・9行目 棋士名
 リーグ戦に属している棋士を(リーグ戦開始時の)順位に従いシートmから持ってきている。
 なお、セルc1にある数値はリーグ戦の人数である。10行目の順位点込み勝数を計算する際に使われる。

・10行目 順位点込み勝数
 順位点は、リーグの順位に応じて次の計算式で計算した値を各棋士に付与している。
   順位点=(リーグ戦の人数-順位)/リーグ戦の人数
    例.リーグの人数が10人ならば、
      1位→順位点 0.9点
      2位→順位点 0.8点
        :
      9位→順位点 0.1点
     10位→順位点 0.0点
 「順位点」と「X回戦までの勝数」を加えた値が10行目にセットされている。

・11行目 合計勝数
 上記10行目の「順位点込み勝数」に上記7行目「勝者」に当該棋士の名前が表れる件数を加えた値を「合計勝数」として11行目にセットする。
 当該棋士の名前が表れる回数はcountif関数を用いて求める。

・12行目 当期順位
 rank関数を使って、合計勝数に基づき当期順位を導き出す。

・15行目~ 回数
 15行目以下は順位に従い、各棋士ごとに1行ずつ展開される。
 A列には、棋士名がセットされる。
 B列には、12行目の当期順位がセットされる。ただし、12行目では横に展開していたものがここでは縦に展開している。
 C列以降には、それぞれの順位になった回数をセットする。各セルではB列にある当期順位と14行目にある数字が一致した場合に、それまでの値にさらに1を加算する。

 シートmではこの「回数」を2列目の「試行回数」で割った値を「発生確率」として表示している。


タグ:

+ タグ編集
  • タグ:
最終更新:2010年01月04日 11:35