整数の一様乱数を得る

Rで一様乱数を得るには runif 関数を使う。ヘルプに、

runif will not generate either of the extreme values unless max = min or max-min is small compared to min, and in particular not for the default arguments.

http://stat.ethz.ch/R-manual/R-devel/library/stats/html/Uniform.html

とあるように、両端の値は発生しない。

したがって、-5 から 5 までの 11個の整数を一様に発生させたい時は、

floor(runif(100, min=-5, max=5+1)

とする。floor で下に落としているので、max を1つ増やしておかないといけないのである。これで、(-5, 6) の範囲の一様乱数が得られるから、区間でいうと (-5, -4), [-4, -3), ..., [4, 5), [5, 6) が均等に発生し、floor の結果として、対応する -5, -4, ..., 4, 5 が均等に発生することになる。-5.000 が発生しないのに -4.000 や -3.000 は発生するという点で、ごく僅かに (-5, -4) の確率が低下しているように見えるかもしれないが、これは無限小区間なので問題ない。

max=5 だと (-5, 5) の範囲の一様乱数が得られるから、区間でいうと (-5, -4), [-4, -3), ..., [4, 5) が均等に発生し、floor の結果として、対応する -5, -4, ..., 4 しか得られない。

sort(unique(floor(runif(100, min=-5, max=5+1))))
sort(unique(floor(runif(100, min=-5, max=5))))

で確認されたし。

なお、min と max の範囲が狭い場合は、sample を使ったほうが速いうえ分かりやすい。

sample(-5:5, 100, replace=TRUE)

library(rbenchmark)
benchmark(sample(-5:5, 1000000, replace=TRUE), floor(runif(1000000, min=-5, max=5+1)))