Inverta a técnica de Box-Mueller : de cada par de normais (X,Y) , dois uniformes independentes podem ser construídos como atan2(Y,X) (no intervalo [−π,π] ) e exp(−(X2+Y2)/2) (no intervalo [0,1] ).
Pegue as normais em grupos de dois e some seus quadrados para obter uma sequência de χ22 variáveis Y1,Y2,…,Yi,… . As expressões obtidas dos pares
Xi=Y2iY2i−1+Y2i
terá uma distribuição Beta(1,1) uniforme.
Que isso exija apenas aritmética básica e simples deve ficar claro.
Como a distribuição exata do coeficiente de correlação de Pearson de uma amostra de quatro pares de uma distribuição normal bivariada padrão é distribuída uniformemente em [−1,1] , podemos simplesmente tomar as normais em grupos de quatro pares (ou seja, oito valores em cada conjunto) e retorne o coeficiente de correlação desses pares. (Isso envolve operações aritméticas simples mais operações com duas raízes quadradas.)
Sabe-se desde os tempos antigos que uma projeção cilíndrica da esfera (uma superfície em três espaços) é de área igual . Isso implica que, na projeção de uma distribuição uniforme na esfera, tanto a coordenada horizontal (correspondente à longitude) quanto a vertical (correspondente à latitude) terão distribuições uniformes. Como a distribuição normal padrão trivariada é esfericamente simétrica, sua projeção na esfera é uniforme. A obtenção da longitude é essencialmente o mesmo cálculo do ângulo no método Box-Mueller ( qv ), mas a latitude projetada é nova. A projeção na esfera apenas normaliza um triplo de coordenadas (x,y,z) e nesse pontoz é a latitude projetada. Portanto, pegue as variáveis Normal em grupos de três,X3i−2,X3i−1,X3i e calcule
X3iX23i−2+X23i−1+X23i−−−−−−−−−−−−−−−−√
para i=1,2,3,… .
Uma vez que a maioria dos sistemas de computação representar números em binário , geração de número uniforme geralmente começa por produzir uniformemente distribuídas números inteiros entre 0 e 232−1 (ou algum alto poder de 2 relacionada com o comprimento da palavra de computador) e rescaling-los, conforme necessário. Tais números inteiros são representados internamente como cadeias de caracteres de 32 dígitos binários. Podemos obter bits aleatórios independentes comparando uma variável Normal com sua mediana. Assim, basta dividir as variáveis normais em grupos de tamanho igual ao número desejado de bits, comparar cada uma com sua média e montar as seqüências resultantes de resultados verdadeiro / falso em um número binário. Escrevendo kpara o número de bits e H para o sinal (ou seja, H(x)=1 quando x>0 e H(x)=0 caso contrário), podemos expressar o valor uniforme normalizado resultante em [0,1) com a fórmula
∑j=0k−1H(Xki−j)2−j−1.
As variáveis podem ser obtidas de qualquer distribuição contínua cuja mediana é 0 (como uma Normal normal); eles são processados em grupos de k com cada grupo produzindo um desses valores pseudo-uniformes.Xn0k
A amostragem por rejeição é uma maneira padrão, flexível e poderosa de extrair variáveis aleatórias de distribuições arbitrárias. Suponha que a distribuição de destino tenha PDF . Um valor Y é desenhado de acordo com outra distribuição no PDF g . Na etapa de rejeição, um valor uniforme U entre 0 e g ( Y ) é desenhado independentemente de Y e comparado a f ( Y ) : se for menor, YfYgU0g(Y)Yf(Y)Yé retido, mas, caso contrário, o processo é repetido. Essa abordagem parece circular: como podemos gerar uma variável uniforme com um processo que precisa de uma variável uniforme para começar?
A resposta é que, na verdade, não precisamos de uma variável uniforme para executar a etapa de rejeição. Em vez disso (assumindo ), podemos jogar uma moeda justa para obter um 0 ou 1 aleatoriamente. Isso será interpretado como o primeiro bit na representação binária de uma variável uniforme U no intervalo [ 0 , 1 ) . Quando o resultado é 0 , o que significa 0 ≤ L < 1 / 2 ; de outro modo, um / 2 ≤ L < 1 . g(Y)≠001U[0,1)00≤U<1/21/2≤U<1Metade do tempo, este é suficiente para decidir o passo rejeição: se , mas a moeda é 0 , Y deve ser aceite; Se f ( Y ) / g ( Y ) < 1 / 2 , mas a moeda é 1 , Y deve ser rejeitado; caso contrário, precisamos jogar a moeda novamente, a fim de obter o próximo bit de U . Porque - não importa qual valor f ( Yf(Y)/g(Y)≥1/20Yf(Y)/g(Y)<1/21YU contém - há um 1 / 2 possibilidade de parar após cada aleta, o número esperado de flips só é 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
A amostragem de rejeição pode valer a pena (e ser eficiente), desde que o número esperado de rejeições seja pequeno. Podemos fazer isso ajustando o maior retângulo possível (representando uma distribuição uniforme) abaixo de um PDF normal.
Usando cálculo para otimizar a área do retângulo, você vai achar que seus endpoints deve ficar em , onde a sua altura é igual a exp ( - 1 / 2 ) / √±1, tornando sua área um pouco maior que0,48. Usando essa densidade normal padrão comogerejeitando todos os valores fora do intervalo[-1,1]automaticamente e aplicando o procedimento de rejeição, obteremos variáveis uniformes em[-1,1] de formaeficiente:exp(−1/2)/2π−−√≈0.2419710.48g[−1,1][−1,1]
Em uma fração do tempo, a variável Normal está além de [ - 1 , 1 ] e é imediatamente rejeitada. ( Φ é o CDF normal padrão.)2Φ(−1)≈0.317[−1,1]Φ
Na fração restante do tempo, o procedimento de rejeição binária deve ser seguido, exigindo mais duas variáveis normais em média.
O processo global requer uma média de etapas.1/(2exp(−1/2)/2π−−√)≈2.07
O número esperado de variáveis normais necessárias para produzir cada resultado uniforme funciona para
2eπ−−−√(1−2Φ(−1))≈2.82137.
Embora isso seja bastante eficiente, observe que (1) o cálculo do PDF normal exige o cálculo de um exponencial e (2) o valor deve ser pré-computado de uma vez por todas. Ainda é um pouco menos de cálculo do que o método Box-Mueller ( qv ).Φ(−1)
As estatísticas de pedidos de uma distribuição uniforme têm lacunas exponenciais. Como a soma dos quadrados de duas Normais (com média zero) é exponencial, podemos gerar uma realização de uniformes independentes somando os quadrados dos pares dessas Normais, calculando a soma acumulada destes, redimensionando os resultados para cair no intervalo [ 0 , 1 ] e soltando o último (que sempre será igual a 1 ). Essa é uma abordagem agradável porque requer apenas quadratura, soma e (no final) uma única divisão.n[0,1]1
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 n is very large, this process could be carried out in smaller groups of k with little loss of efficiency, since each group needs only 2(k+1) Normals to create k uniform values. For fixed k, the asymptotic computational cost is therefore O(nlog(k)) = O(n), needing 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.