乱数とランダム感
本当の乱数はランダムに見えない
https://gyazo.com/8fbfd37c8bfdea0802480e13c78e7318
「ランダムなもの」と「ランダムに見えるもの」とは微妙な違いがあります。完全にランダムな数値列であってもパターンが有るように感じてしまう場合があります。例えば円周率の数字列は乱数列であるはずですが、以下のような繰り返しパタンが見られるので「本当に円周率はランダムなのか?」と疑ってしまうかもしれません。 3.1415926535897932384626
また、円周率は小数点以下31桁目まで「0」が出現しません。これもかなり不自然なことなのではないでしょうか?
実はこれは不思議でも何でもなく、乱数には様々な規則性が感じられるのが普通です。たとえば200個の数字をランダムに出力すると、以下のような数字列が得られます。同じ数字が続いたり集中的に出現したりしている場所が以外と多いことがわかります。
code:random.txt
5537341995738855180096821833451569453844
5126548435984280087032949714244066204568
5246606854062184696468382628769542110440
7970935754806044804841637277410786609493
4157092911640557823043091823428633318910
...
ランダムに生成した数値をX、Y座標としてグラフ上に点を描くと下図のようになりますが、点は均等に分布せず、片寄りがあるように感じられてしまいます。
http://gyazo.com/65f5941a08bbad5052fe73de248b1512.png
ランダムに座標を生成して点を描いたもの
10枚の写真をランダム表示しようとする場合、毎回完全にランダムに写真を選んで表示すると、現在の写真と同じものが次も表示される確率は1/10ですから、かなり高頻度で同じ写真が連続して表示されることになり、ランダム性が低いように感じられてしまいます。ランダムに写真が表示されるように感じるためには、同じような写真が続けて表示されないような工夫が必要です。iPodなどの音楽再生機器には「シャッフル再生」という機能がありますが、本当の乱数を使ってシャッフル再生を行なうと同じ曲が連続して再生されること多々あることになり、選曲がランダムでないと感じられてしまうので、そうならない工夫がされているようです。本当にランダムな値は一様に分布することはなく、片寄りが見られる場合も多いので、人間にとってランダムに感じられるようにするためには、本当の乱数のかわりにランダムに感じられるような数字列を使うのが効果的です。 デジタルフォトフレームなどでN枚の写真をランダムに再生するとき、すべての写真が表示されるにはかなり時間がかかるのが普通です。何枚表示したときすべての写真が表示されるのかを調べてみると左図のようになります。100枚の写真のランダム表示を行なうとき、3-400回ぐらい表示を更新させないとすべての写真が表示されないのが普通だということがわかります。 http://gyazo.com/cfc399cee7b2a89e6a6b2341fa96c141.png
すべての写真が表示されるまでに表示された枚数
本当にランダムなものではなくランダムっぽく感じられる値を得るためには、これまで出なかった値が出やすいような「ニセ乱数」を作るとよいでしょう、たとえば以下のような工夫が考えられます。
最近出た値は出さない
最近のN回で一度も出ていない値は出現確率を上げる
このように工夫したニセ乱数を使って同じ計算を行なうと左図のような結果になります。160回あたりにピークがあり、300回すればほぼ確実にすべての写真を表示できるので、ランダム表示としてはこちらの方が気持ちが良いでしょう。
http://gyazo.com/64073dac19e7c0e1c4f08f24ab3cfcff.png
二次元ニセ乱数
ランダムに見える二次元表示を行ないたい場合も、本当の乱数を使うよりもニセ乱数を利用する方がランダム感が出ます。下図の「文字列捜しパズル」では普通の乱数を使って文字を並べているため、同じ文字が3個以上縦や横に並んでいる場所がいくつも存在し、ランダム感があまり感じられません。ランダムに並べた文字がランダムに見えない一方、前述のニセ乱数と同じような方法を使って上下に同じ文字が並びにくいように工夫すると、もうひとつ下の図のような問題になります。上の絵よりもランダムさが大きいように見えるでしょう。私がAndroidアプリとして公開しているものでは、ニセ乱数を使ってランダム感が出るようにしています。 http://gyazo.com/22ed0a1cec44f1e74082afcba8117423.png
ランダムに文字を置いた「四文字熟語クイズ」
http://gyazo.com/8e6565b280f53079104800041001415b.png
ニセ乱数で文字を配置したもの