R変動シミュレータ「SIMRate」の説明

Rの変動や分布の研究のための強力な内蔵ツール「SIMRate」について説明します。
何百万試合にも及ぶ「試合」を、モンテカルロシミュレーションの手法を用いて、ほんの数秒でこなすことができます。
実際にSIMRateを起動すれば「ヒント」が表示され、簡単な使い方についてはそれで充分理解できるものと思いますので、このマニュアルには、シミュレータの機能・特長紹介と具体的なパラメータの指定テクニック、そして技術的な情報を記述します。




SIMRateを使って、例えばこんなことができます(機能紹介と特長)

・目標R達成確率を求める
あと何試合以内に、目標のRに到達できるかなあ? などの疑問に対し、一瞬の超高速演算で解答を与えます。

・Rの分布を調べる
Rは、どのように分布するのか? 麻雀の「実力」が「はっきり違う」と言えるのは、どの程度離れたRからか?
こういった疑問に、直感的な意見なら、これまでたくさん──本当にたくさん──語られてきました。
このツールは、どんな直感よりも最も高速に、最も合理的に、そして最も正しく正解を導くでしょう。

・最高到達R・最低到達Rを求める
試合数と安定R、現在のRから、あと何試合打つ場合に、果たして最高でどのくらいのRを出せるのか? またついてない場合にどこまでRが下がり得るのか? そういったことをシミュレートできます。

・Rが安定する試合数を求める
400試合を超えると「安定期」と言われることが多いですが、本当に400試合が「安定期」でしょうか?
Rが安定期に入る試合数を、合理的に求めることができます。

・その他様々な解析
パラメータの工夫次第で、様々な研究を行うことができます。

・とても高速です
以上のようなシミュレーション(何百万試合にも及ぶ「試合」)を、ほんの数秒でこなすことができます。

・ヒマツブシにも研究にも最適です
「適当にいじってみる」ような状態でパラメータを不都合な値に設定しても、安全機能によって、エラーにはなっても深刻な現象は起きません(せいぜい、シミュレートが失敗する程度です)。しかし、研究するために安全機能を外してパラメータを操作することも可能です。ユーザの目的による自由度が高い、使いやすいソフトです。


使い方の具体例

「とりあえず今までの1000試合の集計をした。今後100試合打つと、Rはどのくらいになるだろう」
実際に集計し、集計結果の画面からSIMRateを起動すると、安定Rと(最後の試合から予想される)初期Rが、「現在の値」として設定されます。
だから、集計した直後になら、そのまま1セット当たりの試合数を変えるだけで(この場合100に)、簡単に「自分のRの変動予測」をたてることができます。
同じように、「目標R」として条件0にRを指定すれば、その目標Rを達成するためにあと何試合くらいかかるかがすぐにわかります。

「実力R1800なのだが、不調で1750まで下がってしまった、200試合打ったらどのくらいまで回復するかな?」
初期R1750、実力1800に設定します。
1セット当たりの試合数を200に、セット数を1000にします。
シミュレートすると、下の欄に「セット終了時R平均」が出るはずです。
これが求めたい値です。

「R2000を超えた。まだ実力は1950だが、現在のRは2020。あと何試合くらいR2000台でいられるか?」
初期R2020、実力1950に設定します。
条件1で「試合数0以上、R2000以下」にします。
1セット当たりの試合数を1000に、セット数を1000にします。
これでシミュレートすると、「条件1抵触時試合数」として、目的の値を知ることができます。
ただし、条件に抵触せず1000試合終わった場合が(もし)あれば、その分も計算に含めて下さい。

「現在のRが1980。実力はR1900だが、あと50試合のうちに、R1950を切る前にR2000に到達する確率を調べたい」
初期R1980、実力1900に設定します。
条件0で「R2000以上」にします。
条件1で「試合数0以上、R1950以下」にします。
1セット当たりの試合数を50に設定します。
こうして、「条件0抵触回数」や「条件1抵触回数」、また、条件に抵触せず終了した回数を調べることで、目的の確率を求めることができます。

「第一で、400試合R2600の人を見た。これはイカサマだろうか?」
第一では、安定R2150にも及ぶ人は存在しません。そこで、第一で可能な安定Rの「上限」を2150としましょう。
その上で、初期R1500、実力2150とし、1セットあたり400にしてシミュレートを行います。
1000セットでの最高到達Rを見て下さい。まず、2600には到達していないはずです。
この段階で「イカサマ」と合理的に結論づけても良いですが、たまたま1000人に1人程度の割合で起こる「幸運」に恵まれたのかもしれない、と良心的に解釈し、100000セットくらい調べてみます。100000セット調べても1度も到達できない水準であれば、完全に「イカサマです」と主張することができるでしょう。そのような水準になれば、疑うことが当然であって、むこうが「イカサマでない証拠」を出さなければならないでしょう。
ところで通常使用の場合、「セット数」「セットあたりの試合数」は1000までしか指定できませんが、こうした研究のために、それ以上の値を指定する方法も用意しています。興味のある方は、「研究用オプション」に記載されているのでご覧下さい。


技術的な情報

中断条件のデフォルトについて
中断条件は、基本的には、デフォルトの状態のままにしておけば「条件を指定しないこと」とほぼ同等の役割を演じます。
通常のシミュレーションにおいてはほぼあり得ないような条件が、あらかじめの「条件」として設定されているためです。
実際に使いたい条件の部分の値だけを変えれば、通常は望み通り動作するでしょう。

中断条件に抵触して中断されたセットの、データに与える影響 
★重要★
中断条件に抵触してセットを中断した場合、そのセットはデータ「最高到達R」や「最低到達R」に記録されません。
「セット終了時平均R」にも集計されません。
ただし、データ「Rの単純な分布」には、中断する直前のデータまでが残ります。
例えば「R2000超えたら中断」であっても、直前のR1998などは記録されます。
また「トータル試合数」は、「こなした試合数」を表すので、中断した場合でもその瞬間の対戦までしっかり記録されます。
分析にあたっては、このような、誤解の生じやすい中断の際のデータへの影響について、正しい理解が望まれます。

SIMRateのシミュレーション原理について
疑似乱数を発生させ、これを用いて「実験」を行う手法がモンテカルロシミュレーションです。
SIMRateでは疑似乱数を用いて、実力Rから計算したある割合で「順位」を取り出すことによって、シミュレーションを行っています。
疑似乱数の発生には、ANSI Cで定められたrand関数(一様分布)と同等の結果をもたらす関数を用いています。乱数の種はPCの時刻から取っています。

Rの変動方法について 
★重要★
内部処理的には、他家平均Rは1500で固定し、それに対する「安定R」の人の勝率で、「順位」を決定してRを変動させています。
これは計算量を減らすためです。
Rの変動の期待値は結局同じなので、少なくない試合数に対する結果は正確ですが、極端に少ない試合数に対しては誤差が生じます。
充分注意して下さい。

順位の決定方法について 
★重要★
順位の決定方法ですが、本来、ある実力Rに対して1位・2位・3位・4位がある分布をするのに対し、このシミュレータでは「1.5位率」と「3.5位率」を算出し、各々を実力に対応するある割合で取り、その中で半々で1位または2位・3位または4位を取るような動作を行っています。従って、R1500の相手に対して平均順位1.5位以上とか、3.5以下の実力を出す人に対して、シミュレーションのデータは全く保証されません。
また、前項の事情と、この事情の双方の影響で、極端に少ない試合数を1セットとしてデータを取ることは誤差を大きくします。
例えば「5試合・1000セットの間に変動するR」等は、正確には出ないと思われます。
目的によりますが、1セットあたり20〜30試合程度になれば、通常は問題ないと考えられます。

SIMRate v3.0〜v3.3の計算について 
★重要★
SIMRateは、v3.0〜v3.3のバージョンにおいて、場合によっては致命的な結果を引き起こすバグが発見されましたゞ(´▽`;)
最高R到達試合数の集計で240試合の近辺に特異点が現れる現象がそれです。
また、R分布についても同じ原理の挙動を起こします。
単純な、小数の切り捨てのミスだったのでv3.4では修正されています。
論文のデータはv3.0より以前のバージョンを用いており、この影響はありません。


研究用オプション

セットあたりの試合数・セット数の、研究のための指定について
通常使用の状態では、双方ともに1000までの値を取ることが許可されています。これ以上の値を指定しても最大値に切りつめられます。
問題はメモリリソース圧迫ではなく、主として実行時間にあり、「気軽にいじるだけの」ユーザに負担をかけないためです。
しかしもちろん、主に研究を目的とした用途では「一万試合を1セットにしたい」場合などもあるはずです。
そこでそのような値を指定する方法を用意しています。
「研究用キー」の欄に、半角で「sysma」または「research」という単語を入れて下さい(大文字小文字の区別はありません)。
こうしておくことで、セットあたりの試合数・セット数共に、1000を超える値を用いることができるようになります。
この方法によって、各々の値はメモリリソースの許す限りの値まで取ることが可能になります(例えばとつの環境で、1000万試合×10セット、1億試合分のシミュレートを行うことは可能でした)。
ただし、研究目的以外でこの機能を使用することは推奨しません。
5000*5000のサイズにおいてさえ、とつげき東北の環境(CPUはPentium2-450Mhz)でシミュレートに30秒以上かかりました。
思慮なく大きな値にすると、莫大な時間がかかる上、ある種の変数の値が、取り得る範囲を超えてエラーを起こす可能性などもあります。片方が大きな値を持つ時は、もう片方を小さくするなど、研究の目的に応じて工夫する必要があるでしょう。
タスクは実際の試合数(セット当たりの試合数×セット数)に比例します。

前回の結果と次の結果を合算で表示するための指定について
同様に、「研究用キー」の欄にオプションを指定します。
半角で「chain」(大文字でも可)と記入しておくと、前回の結果がクリアされません。
なお、チェックは厳密でないので、「sysmachain」などと(スペースを入れず)連続にしても構いません。順も不同です。
要は、研究用キーの欄に、その文字列が入っていれば良いのです。
ただし、起動して初めてのシミュレーションで「chain」オプションを付けると、データが不正になりますので必ず初めは普通にシミュレートする必要があります。
また言うまでもないことですが、求める値の性質によっては、ある結果と、その半分の試合数で2回合算した結果とが、必ずしも理論的に等価にならない場合があります。研究をしようとしているレベルの人に対してですから、これ以上は説明しませんが、くれぐれもそういった初歩的な誤謬を犯さないよう細心の注意を払いましょう。