正規分布の計算とは無関係の単純な代数計算を使用するという精神で、私は次のように傾くでしょう。それらは私が考えたとおりに注文されています(したがって、ますます創造的になる必要があります)が、最後まで最高の、そして最も驚くべきことを保存しました。
逆ボックス・ミュラー技術:法線の各対から(X,Y)は、2人の独立した制服のように構成することができるatan2(Y,X)(インターバルで[−π,π])およびexp(−(X2+Y2)/2)間隔で([0,1])。
2のグループに法線を取り、一連の取得するために彼らの正方形を合計χ22変量Y1,Y2,…,Yi,…。式ペアから得られた
Xi=Y2iY2i−1+Y2i
必要がありますBeta(1,1)一様である分布を、。
これには基本的な単純な算術のみが必要であることは明らかです。
なぜならピアソン相関係数の正確な分布を標準的な二変量正規分布から4ペアのサンプルのが均一に分布している[−1,1]、我々は単に(すなわち、8つの値の4つのペアのグループに法線を取ることができます各セット)とこれらのペアの相関係数を返します。(これには、単純な算術演算と2つの平方根演算が含まれます。)
古くから、球体の円柱投影(3空間の表面)は等面積であることが知られています。これは、球体上の均一な分布の投影では、水平座標(経度に対応)と垂直座標(緯度に対応)の両方が均一に分布することを意味します。3変量標準正規分布は球対称であるため、球への投影は均一です。 経度の取得は、基本的にBox-Mueller法の角度(qv)と同じ計算ですが、投影された緯度は新しいものです。球体への投影は、3組の座標(x 、z )を正規化するだけです。(x,y,z)そしてそのポイントでは投影された緯度です。したがって、3つのグループ、X 3 i − 2、X 3 i − 1、X 3 iの正規変量を取り、計算します。zX3i−2,X3i−1,X3i
X3iX23i−2+X23i−1+X23i−−−−−−−−−−−−−−−−√
以下のために。i=1,2,3,…
ほとんどのコンピューティングシステムは2進数で数値を表現するため、通常、均一な数値の生成は、0から2 32 − 1(またはコンピューターの語長に関連する2の高いべき乗)の均一に分布した整数を生成し、必要に応じて再スケーリングすることから始まります。このような整数は、32桁の2進数の文字列として内部的に表されます。Normal変数をその中央値と比較することにより、独立したランダムビットを取得できます。したがって、Normal変数を目的のビット数に等しいサイズのグループに分割し、それぞれをその平均と比較し、真/偽の結果の結果シーケンスを2進数に組み立てるだけで十分です。kを書く0232−1232kビットの数の記号のために(ある、H (X )= 1とき、X > 0及びH (X )= 0その他)我々が得られた正規化された均一な値を表現することができる[ 0 、1 )式とHH(x )=1x > 0H(x)=0[0,1)
∑j=0k−1H(Xki−j)2−j−1.
変量から引き出すことができる任意のその中央値である連続分布0(標準的な通常通り); それらはkのグループで処理され、各グループはそのような疑似均一値を1つ生成します。Xn0k
棄却サンプリングは、任意の分布からランダム変量を抽出するための標準的で柔軟な強力な方法です。ターゲット分布にPDF ます。値Yは、PDF gの別の分布に従って描画されます。棄却ステップでは、0とg (Y )の間にある均一な値UがYとは独立して描画され、f (Y )と比較されます:小さい場合はYfYgU0g(Y)Yf(Y)Y保持されますが、それ以外の場合はプロセスが繰り返されます。しかし、このアプローチは循環的に思えます。最初に一様変量を必要とするプロセスで、どのように一様変量を生成するのでしょうか。
答えは、棄却ステップを実行するために実際に一様変量を必要としないということです。代わりに(仮定して)フェアコインをフリップして、0または1をランダムに取得できます。これは、均一な変量のバイナリ表現に最初のビットとして解釈されるU間隔で[ 0 、1 )。結果がある場合に0ことを意味0 ≤ U < 1 / 2。そうでない場合は、1 / 2 ≤ U < 1。 g(Y)≠001U[0,1)00≤U<1/21/2≤U<1:時間の半分が、これは拒否ステップを決定するのに十分であるならばが、硬貨は0、Yが受け入れなければなりません。もしF (Y )/ G (Y )< 1 / 2が、硬貨は1、Yが拒否されるべきです。そうでない場合は、Uの次のビットを取得するために、コインを再度フリップする必要があります。なぜなら、どんな値f (Yf(Y)/g(Y)≥1/20Yf(Y)/g(Y)<1/21YU有する-がある 1 / 2各フリップの後に停止する可能性は、フリップの予想される数はわずかであり、 1 / 2 (1 )+ 1 / 4 (2 )+ 1 / 8 (3 )+ ⋯ + 2 − n(n )+ ⋯ = 2。f(Y)/g(Y)1/21/2(1)+1/4(2)+1/8(3)+⋯+2−n(n)+⋯=2
予想される拒否の数が少ない場合、拒否サンプリングは価値があり(かつ効率的)な場合があります。これは、標準PDFの下に可能な限り大きな長方形(均一な分布を表す)を収めることで実現できます。
長方形の面積を最適化するための微積分を使用して、そのエンドポイントはであるべきであることがわかりますの高さが等しい、EXP (- 1 / 2 )/ √±1exp(−1/2)/2π−−√≈0.241971, making its area a little greater than 0.48. By using this standard Normal density as g and rejecting all values outside the interval [−1,1] automatically, and otherwise applying the rejection procedure, we will obtain uniform variates in [−1,1] efficiently:
In a fraction 2Φ(−1)≈0.317 of the time, the Normal variate lies beyond [−1,1] and is immediately rejected. (Φ is the standard Normal CDF.)
In the remaining fraction of the time, the binary rejection procedure has to be followed, requiring two more Normal variates on average.
The overall procedure requires an average of 1/(2exp(−1/2)/2π−−√)≈2.07 steps.
The expected number of Normal variates needed to produce each uniform result works out to
2eπ−−−√(1−2Φ(−1))≈2.82137.
Although that is pretty efficient, note that (1) computation of the Normal PDF requires computing an exponential and (2) the value Φ(−1) must be precomputed once and for all. It's still a little less calculation than the Box-Mueller method (q.v.).
The order statistics of a uniform distribution have exponential gaps. Since the sum of squares of two Normals (of zero mean) is exponential, we may generate a realization of n independent uniforms by summing the squares of pairs of such Normals, computing the cumulative sum of these, rescaling the results to fall in the interval [0,1], and dropping the last one (which will always equal 1). This is a pleasing approach because it requires only squaring, summing, and (at the end) a single division.
The n values will automatically be in ascending order. If such a sorting is desired, this method is computationally superior to all the others insofar as it avoids the O(nlog(n)) cost of a sort. If a sequence of independent uniforms is needed, however, then sorting these n values randomly will do the trick. Since (as seen in the Box-Mueller method, q.v.) the ratios of each pair of Normals are independent of the sum of squares of each pair, we already have the means to obtain that random permutation: order the cumulative sums by the corresponding ratios. (If nk2(k+1)kkO(nlog(k))O(n)2n(1+1/k) Normal variates to generate n uniform values.)
To a superb approximation, any Normal variate with a large standard deviation looks uniform over ranges of much smaller values. Upon rolling this distribution into the range [0,1] (by taking only the fractional parts of the values), we thereby obtain a distribution that is uniform for all practical purposes. This is extremely efficient, requiring one of the simplest arithmetic operations of all: simply round each Normal variate down to the nearest integer and retain the excess. The simplicity of this approach becomes compelling when we examine a practical R
implementation:
rnorm(n, sd=10) %% 1
reliably produces n
uniform values in the range [0,1] at the cost of just n
Normal variates and almost no computation.
(Even when the standard deviation is 1, the PDF of this approximation varies from a uniform PDF, as shown in the following figure, by less than one part in 108! To detect it reliably would require a sample of 1016 values--that's already beyond the capability of any standard test of randomness. With a larger standard deviation the non-uniformity is so small it cannot even be calculated. For instance, with an SD of 10 as shown in the code, the maximum deviation from a uniform PDF is only 10−857.)
In every case Normal variables "with known parameters" can easily be recentered and rescaled into the Standard Normals assumed above. Afterwards, the resulting uniformly distributed values can be recentered and rescaled to cover any desired interval. These require only basic arithmetic operations.
The ease of these constructions is evidenced by the following R
code, which uses only one or two lines for most of them. Their correctness is witnessed by the resulting near-uniform histograms based on 100,000 independent values in each case (requiring around 12 seconds for all seven simulations). For reference--in case you are worried about the amount of variation appearing in any of these plots--a histogram of uniform values simulated with R
's uniform random number generator is included at the end.
All these simulations were tested for uniformity using a χ2 test based on 1000 bins; none could be considered significantly non-uniform (the lowest p-value was 3%--for the results generated by R
's actual uniform number generator!).
set.seed(17)
n <- 1e5
y <- matrix(rnorm(floor(n/2)*2), nrow=2)
x <- c(atan2(y[2,], y[1,])/(2*pi) + 1/2, exp(-(y[1,]^2+y[2,]^2)/2))
hist(x, main="Box-Mueller")
y <- apply(array(rnorm(4*n), c(2,2,n)), c(3,2), function(z) sum(z^2))
x <- y[,2] / (y[,1]+y[,2])
hist(x, main="Beta")
x <- apply(array(rnorm(8*n), c(4,2,n)), 3, function(y) cor(y[,1], y[,2]))
hist(x, main="Correlation")
n.bits <- 32; x <- (2^-(1:n.bits)) %*% matrix(rnorm(n*n.bits) > 0, n.bits)
hist(x, main="Binary")
y <- matrix(rnorm(n*3), 3)
x <- y[1, ] / sqrt(apply(y, 2, function(x) sum(x^2)))
hist(x, main="Equal area")
accept <- function(p) { # Using random normals, return TRUE with chance `p`
p.bit <- x <- 0
while(p.bit == x) {
p.bit <- p >= 1/2
x <- rnorm(1) >= 0
p <- (2*p) %% 1
}
return(x == 0)
}
y <- rnorm(ceiling(n * sqrt(exp(1)*pi/2))) # This aims to produce `n` uniforms
y <- y[abs(y) < 1]
x <- y[sapply(y, function(x) accept(exp((x^2-1)/2)))]
hist(x, main="Rejection")
y <- matrix(rnorm(2*(n+1))^2, 2)
x <- cumsum(y)[seq(2, 2*(n+1), 2)]
x <- x[-(n+1)] / x[n+1]
x <- x[order(y[2,-(n+1)]/y[1,-(n+1)])]
hist(x, main="Ordered")
x <- rnorm(n) %% 1 # (Use SD of 5 or greater in practice)
hist(x, main="Modular")
x <- runif(n) # Reference distribution
hist(x, main="Uniform")