データ発見隊

最終回 乱数思考

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

乱数とランダム感

「ランダムなもの」「ランダムに感じられるもの」では微妙な違いがあります。

ランダムなのにランダムではなく感じる

完全にランダムな数値列であっても,パターンがあるように感じてしまう場合があります。

円周率

たとえば円周率の数字列は乱数列であるはずですが,小数点以下30桁以上も「0」が出現しませんし,次のような繰り返しパターンが見られるので,⁠本当にランダムなのか?」と疑ってしまうかもしれません。

3.1415926535897932384626
ランダムな数字

次のRubyプログラムを実行して200個の数字をランダムに出力します。

200.times {
  print rand(10)
}

すると,たとえば次のような数字列が得られます。同じ数字が続いたり集中的に出現したりしている場所が意外と多いことがわかります。

5537341995738855180096821833451569453844512654843598428
0087032949714244066204568524660685406218469646838262876
9542110440797093575480604480484163727741078660949341570
92911640557823043091823428633318910
ランダムな二次元座標

また,次のようなプログラムでランダムに二次元座標を生成してプロットすると図2のようになりますが,座標の分布には偏りがあるように感じてしまいます。

1000.times {
  puts "#{rand(256)} #{rand(256)}"
}

図2 ランダムな座標

図2 ランダムな座標

ランダムなスライドショー

10枚の写真をランダムにスライドショー表示しようとする場合,現在の写真と同じ写真が次も表示される確率は1/10ですが,同じ写真が続けて表示されることが多いと,ランダム性が低いように感じられてしまいます。ランダムに写真が表示されるように感じるためには,同じような写真が続けて表示されないような工夫が必要です。iPodのような音楽再生機器には「シャッフル再生」という機能がありますが,本当の乱数を使ってシャッフル再生を行うと同じ曲が連続して再生されることが多々あることになり,選曲がランダムでないと感じられてしまうので,そうならない工夫がされているようです。本当にランダムな値は一様に分布することはなく,片寄りが見られる場合も多いので,人間にとってランダムに感じられるようにするためには本当の乱数を利用するのではなく,ランダムに感じられるような数字列を使うのが効果的です。

N枚のスライドをランダムに再生するとき,すべてのスライドが表示されるにはかなり時間がかかるのが普通です。何枚表示したときすべてのスライドが表示されるのかを調べるRubyプログラムは次のようになります。

n = (ARGV.shift || 100).to_i # スライドの数
trials = (ARGV.shift || 10000).to_i # 試行回数
histdiv = (ARGV.shift || 20).to_i # ヒストグラムの粒度
lim = (ARGV.shift || 2000).to_i # 表示上限
hist = [] # ヒストグラム

trials.times {
  shown = []
  nshown = 0
  count = 0
  while nshown < n do
    ind = rand(n)
    if !shown[ind] then
      shown[ind] = true
      nshown += 1
    end
    count += 1
  end
  hist[count/histdiv] = hist[count/histdiv].to_i + 1
}

100000.times { |i|
  puts "#{i*histdiv} #{hist[i].to_i}"
  break if i*histdiv >= lim
}

100枚の写真のスライドショーを行う場合,500枚ぐらいランダムに表示しても,なかなかすべての写真は表示されないことがわかります図3)⁠

図3 乱数によるスライドショー

図3 乱数によるスライドショー

著者プロフィール

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

慶應義塾大学教授。ユビキタス時代のインタフェース技術の研究開発に従事。

本棚.orgGyazoQuickMLFeedTVなど各種のネットサービスを運用中。

http://www.pitecan.com/