2011年7月20日水曜日

ランダムの妥当性とは?~その1

小難しいタイトルですが、ランダムの妥当性ってなんなのか考えてみることにしました。

とりあえず、スタートのスクリプトは@fumokmmさんのエントリー『Groovyで範囲内乱数』です。

では、スクリプトをどうぞ。(コピペ)

IntRange.metaClass.define{
    random{
        int from = delegate.isReverse() ? to : from
        int to = delegate.isReverse() ? from : to
        int size = to - from + 1
        (Math.floor(Math.random() * size) + from) as int
    }
}


これで、乱数発生の装置は作成できたので、おもむろに作成した乱数をListにぶっこむ処理を書いてみる。


range = 1..20
def getRandom = {run ->
    def values = []
    run.times{values << range.random()}
    withPool {
        values.parallel
        .map{[it, 1]}
        .groupBy{it[0]}.getParallel()
        .map{it.value = it.value.size();it}
        .sort{it.key}
        .collection
    }
}
そして、実行してみる。
getRandom(20 * 10)
予想される結果としては、1~20までの数値が10個を中心として発生するはず。 実行結果1
[1=4, 2=7, 3=7, 4=14, 5=12, 6=10, 7=12, 8=12, 9=5, 10=10, 11=10, 12=5, 13=8, 14=11, 15=12, 16=19, 17=6, 18=18, 19=10, 20=8]
実行結果2
[1=11, 2=8, 3=11, 4=5, 5=10, 6=10, 7=11, 8=7, 9=14, 10=12, 11=9, 12=11, 13=10, 14=14, 15=10, 16=10, 17=7, 18=12, 19=8, 20=10]
実行結果3
[1=10, 2=10, 3=10, 4=9, 5=14, 6=15, 7=8, 8=11, 9=10, 10=8, 11=7, 12=9, 13=10, 14=10, 15=11, 16=6, 17=10, 18=5, 19=10, 20=17]

む、一応、ランダムに数字が発生しているような気がするが、これはランダムと言えるのだろうか?

0 件のコメント:

コメントを投稿