増井ラボノート コロンブス日和

最終回 発見プログラミング

この記事を読むのに必要な時間:およそ 2 分

乱数の性質の発見

乱数を使って問題を解く場合,JavaScriptのMath.random()のような「一様乱数」関数がよく利用されます。これを呼ぶと,0から1までのランダムな実数が返ります。たとえばrandom()が0.1以下の値を返す確率は1/10です。

ここまでは普通の話ですが,図2のようにrandom()で生成した座標を使って点を表示してみると図3のようになります。一様な乱数というと図4のようなイメージを連想してしまいますが,本当の乱数はこうならないことが発見できるのが面白いところです。

図2 乱数で生成した座標に点を打つ(randam.js)

図2 乱数で生成した座標に点を打つ(randam.js)

図3 生成された点

図3 生成された点

図4 一様な乱数

図4 一様な乱数

乱数はシミュレーションやゲームでよく利用されるものですので,乱数とはどのようなものかについては,エンジニアであれば誰でもなんとなくイメージを持っていると思いますが,乱数をたくさん生成して視覚化してみるとさまざまな発見があったりします。

乱数の足し算

いくつかの乱数の平均をとると何が起こるでしょうか? ランダムなものをいくら集めてもランダムに決まっているだろうと思うかもしれませんが,実は一様な乱数をたくさん足したものは一様乱数にならず,正規分布に近づくことが中央極限定理として知られています。2つのサイコロをふった場合,その数の和が2や12になる確率よりも7になる確率のほうが大きいだろうということは直感的にわかりますが,一様乱数を足した場合も同じだということはよく考えないとわからないかもしれません。そういう場合,何も考えなくてもプログラムで実行してみればそのような性質はすぐ発見できます図56)⁠

図5 乱数を何回か足した結果のヒストグラムを計算(normal.js)

図5 乱数を何回か足した結果のヒストグラムを計算(normal.js)

図6 計算結果

図6 計算結果

乱数の掛け算

乱数をたくさん足すと正規分布になるわけですが,では乱数をたくさん掛けるとどうなるでしょうか? 実は乱数を何度も掛け算したものは「冪分布(べきぶんぷ)⁠になります。図7のプログラムを実行すると図8のような冪分布になります。リニアスケールで青い点を,対数スケールで赤い点を表示しています。

図7 乱数の掛け算のプログラム例(beki.js)

図7 乱数の掛け算のプログラム例(beki.js)

図8 実行結果

図8 実行結果

世の中には「ロングテール」と表現される冪分布がたくさんありますが,どうやらランダムな事象が掛け算的に繰り返されるとロングテール的な現象が発生するようです。

勝負の発見

まったく五分五分の勝負を繰り返した場合でも意外な片寄りを発見できます。

2人に配ったトランプの札を1枚ずつ出して勝負する「戦争ゲーム」というものがあります。このゲームは単純であまり面白いものではありませんが,そもそも勝負はつくものなのでしょうか? Scrapbox上で勝負するプログラムを図9のように書くことができます。

図9 戦争ゲームのプログラム(sensou.js)

図9 戦争ゲームのプログラム(sensou.js)

P5.jsのdraw()がメインプロセスになって勝負の結果を表示しています。2人のプレーヤはplayer()というgeneratorで表現されており,2つのプレーヤプロセスがsetup()で初期化されています。player()もメインプロセスも無限ループになっていますが,yieldでメインプロセスと通信することにより同期しながら対戦が行われます。generator機能を利用すると,このようなシミュレータを柔軟に記述できるので便利です。

このプログラムを実行すると,意外にもすぐに決着がついてしまうことがわかります図10)⁠最初の手札は同じですし,ランダムにしているにもかかわらずあっという間に総取り状態になってしまうということは感慨深いものがあります。条件がまったく同じであっても大きく勝ったり負けたりすることが発見できたことになりますが,ほんの少しのきっかけで運命が変わってしまうのは恐いものだと思います。

図10 勝負の途中

図10 勝負の途中

終わりに

今回紹介したプログラムはすべてScrapbox上に置いてありクリックするだけでブラウザ上で実行できます。Scrapboxは情報整理にたいへん便利なシステムですが,そのうえでプログラムを気軽に作成してさまざまな発見ができることでさらに広い応用が考えられると思います。

18回に渡ってコロンブスの卵的な実用的なシステムをいろいろ紹介してきました。私はこれらを毎日活用していますが,読者の皆さんもぜひ試してみていただければと思います。

Software Design

本誌最新号をチェック!
Software Design 2017年4月号

2017年3月18日発売
B5判/184ページ
定価(本体1,220円+税)

  • 第1特集
    目的から考える! 実作業から学ぶ
    Linux入門(OS操作編)
  • 第2特集
    はじめてのサーバーレスアーキテクチャ
    AWS LambdaとMicrosoft Azure Functionsで体験
  • 一般記事
    [ニフティクラウド mobile backend]mBaaSのしくみ紹介【1】
    クラウドサービスで運用不要! すべておまかせシステムの舞台裏
  • 一般記事
    PG-Stromの構造と機能,そしてその威力とは【後編】
    どのようにGPU は集約演算を実行するのか?
  • 一般記事
    Jamesのセキュリティレッスン【9】
    IPsecの暗号化通信を復号してみよう!

著者プロフィール

増井俊之(ますいとしゆき)

1959年生まれ。慶應義塾大学環境情報学部教授。ユーザーインターフェースの研究者。東京大学大学院を修了後,富士通半導体事業部に入社。以後,シャープ,米カーネギーメロン大学,ソニーコンピュータサイエンス研究所,産業技術総合研究所,Appleなどで働く。2009年より現職。携帯電話に搭載される日本語予測変換システム『POBox』や,iPhoneの日本語入力システムの開発者として知られる。近著に『スマホに満足してますか? ユーザインターフェースの心理学』。

コメント

コメントの記入