@ledsun blog

無味の味は佳境に入らざればすなわち知れず

「有名な統計力学ゲーム」をcanvasで表示してみる

今回のテーマ

前回の

ledsun.hatenablog.com

では、やり取りの結果をSVGのレーダーチャートで表示しました。 SVGではやり取りが1000回を超えると快適に表示できませんでした。 今回は、canvasのレーダーチャートに表示します。

チャート

See the Pen statistical_mechanism_on_canvas_chart by shigeru.nakajima (@ledsun) on CodePen.

さすがはcanvas、圧倒的な描画性能です。 やり取りを一万回ぐらいやるとバランスよく星型になるのがよくわかります。

ちょっとした工夫

canvasであっても1万回描画すると*1それなりの時間がかかります。 そこで複数回のやり取りをまとめて描画しています。 かつ、やり取り回数が多い時は、たくさんまとめて、少なく立ってきたらまとめる数を減らして描画しています。 これで

  • 1千回で1秒
  • 3千回で3秒
  • 1万回で7秒

ぐらいの比率で描画しています*2

やり取り回数が多い時は、たくさんまとめて、少なく立ってきたらまとめる数を減らすための計算式が

Math.ceil(Math.log(残り回数)) + 1

です。logを取って、残り回数の桁に比例*3して、まとめる数を増やしています。 最後に1を足すのは、log(1)が0だからです。まとめる数が0回だと無限ループします。

考察

「有名な統計力学ゲーム」の驚きは、「公平なルールに見えるのに、実際に運用すると不公平(偏り)が生まれる」です。 これは「公平になるには、たかだか数百回のやり取りで十分だろう」という思い込みを利用したトリックに思えます。

「宝くじは、超長期的には損するが、短期的に得することがある」という仮説が考えられます。 このルールを見たときにも同様に 「長期的には公平であるが、公平になるまでには偏りは生まれる」までは予想できます。

実際に手で試してみると、数十回〜100回程度やり取りしても、公平になりそうな雰囲気が出てきません。 「もしかして、このまま続けても不公平なままなのでは?」という疑問が出てきます。 ここに驚きを感じます。

1000回試すと、偏りが持ち回りになる様子がわかります。 これで、もっと続ければ公平になりそうに思えてきます。 実際は、3000回やり取りしても、公平にはなりません。 これは当初の「たかだか数百回」の予想とは大きく違っています。

*1:正確には1万回setTimeoutを呼ぶのに掛かる時間です。

*2:実際の時間は実行環境、ブラウザを開いているPCの性能、に依存します。

*3:厳密には比例ではありません