最初のアルゴリズムは、次の2つの理由で失敗します。
のフロアを取ると、大幅に削減できます。実際、、それはゼロになり、値がすべて同じであるセットを提供します。b − a < n(a − b )/ nb − a < n
フロアをとらない場合、結果の値は均等に分散されます。 たとえば、 iid均一変量の単純なランダムサンプル(たとえば、と)では、確率で最大はからまでの上部間隔にはありません。アルゴリズム1の場合、最大値がその間隔内になる確率はです。いくつかの目的では、この超均一性は良好ですが、(a)多くの統計が台無しになるが、(b)理由を判断するのが非常に難しいため、一般にひどいエラーです。= 0 、B = 1 (1 - 1 / N )N ≈ 1 / E ≈ 37 %1 - 1 / N 1 100 %んa = 0b=1(1−1/n)n≈1/e≈37%1−1/n1100%
ソートを避けたい場合は、代わりに独立した指数分布変量を生成します。合計で割ることにより、それらの累積合計を範囲正規化します。最大値を削除します(常になります)。範囲再スケーリングします。(0 、1 )1 (A 、B )n+1(0,1)1(a,b)
3つのアルゴリズムすべてのヒストグラムが表示されます。(それぞれ、値の独立したセットの累積結果を示しています。)アルゴリズム1のヒストグラムに目に見える変動がないことは、そこに問題があることを示しています。他の2つのアルゴリズムのバリエーションは、期待されるものであり、乱数ジェネレーターに必要なものです。n = 1001000n=100
独立した均一変量をシミュレートする多くの(おもしろい)方法については、「正規分布からの描画を使用した均一分布からの描画のシミュレーション」を参照してください。
これR
が図を作成したコードです。
b <- 1
a <- 0
n <- 100
n.iter <- 1e3
offset <- (b-a)/n
as <- seq(a, by=offset, length.out=n)
sim.1 <- matrix(runif(n.iter*n, as, as+offset), nrow=n)
sim.2 <- apply(matrix(runif(n.iter*n, a, b), nrow=n), 2, sort)
sim.3 <- apply(matrix(rexp(n.iter*(n+1)), nrow=n+1), 2, function(x) {
a + (b-a) * cumsum(x)[-(n+1)] / sum(x)
})
par(mfrow=c(1,3))
hist(sim.1, main="Algorithm 1")
hist(sim.2, main="Algorithm 2")
hist(sim.3, main="Exponential")
R
です。一定の間隔で乱数のセットの配列を生成するには、次のコードが機能します。n [ a 、b ]rand_array <- replicate(k, sort(runif(n, a, b))