A geração de uma variável aleatória uniforme contínua revelou-se não uma tarefa fácil, talvez porque a própria formulação do problema seja um pouco absurda, porque logicamente obter aleatoriedade significa não encontrar uma solução. Porém, deixando o mais simples "como vai ser em inglês - não sei?", Em artigos dedicados a algoritmos, você encontrará trabalhos sobre a criação de apenas sequências de números aleatórios.
A classe de gerador "True Random" usa fenômenos físicos e restrições externas, então, por exemplo, para gerar um número aleatório decimal, você pode encontrar a recomendação para usar um "sensor atmosférico". Naturalmente, como amante da programação, esse estado de coisas me parecia injusto e, por muito tempo, "o problema estava amadurecendo". Uma variante da solução, como se esperava da formulação do problema, apareceu por acaso, como um complemento ao problema de compressão para empacotar esferas duras . O problema não encontrou solução analítica, pois ainda não há evidências de sua ausência, respectivamente, a fonte é bastante adequada por signos externos. No entanto, não obtive mais do que complexidade infinita na computação reversa do estado do gerador.
A ideia não é nova, ela foi usada, por exemplo, em sistemas UNIX, mas o motivo pelo qual não posso usar o algoritmo dado como uma função só me deparei com um estudo completo de seu trabalho. É impossível fornecer matematicamente uma flutuação finita de um número infinito de parâmetros, portanto, se o gerador é realmente contínuo, então, ao contrário do aritmético, o número de seus valores é infinito. Na prática, não encontrei nenhuma falha em seu trabalho, mas no total não é mais do que meses de trabalho, embora a "segunda lei da termodinâmica" também esteja do meu lado, ela não fornece confiabilidade lógica estrita. Portanto, não pretendo usar o algoritmo como uma função para sistemas com alta confiabilidade, mas admito que, juntamente com modificações adicionais, a confiabilidade formal pode ser significativamente aumentada.
A fonte de uma variável aleatória contínua uniformemente distribuída é a interação de um elemento com um limite em um modelo de esfera rígida. A interação interna dos elementos tem uma distribuição não uniforme, isso foi verificado nos testes Diehard e, portanto, foi excluída do algoritmo, mas deixada de forma simplificada para "mistura" adicional.
A distribuição uniforme na superfície da esfera é uma distribuição especial e uma transformação adicional é necessária para ir para a versão plana. Descobri essa transformação experimentalmente, não recebi nenhuma ajuda de matemáticos para formar uma hipótese em um teorema, as respostas variaram de "isso é óbvio" a "não estou envolvido nesta área". Esta hipótese soa assim:
D - D-2 .
. .
RandomSphere[Rn_: 2, Pn_: 1, Rb_: 1] :=
Module[{i, j, m, p, r, s, S, X, Xi, Xj, Pm},
X = Array[0 &, {Pn, Rn}]; Pm = Rn; s = 1/Sqrt[2];
For[p = 1, p <= Pn, p++, i = RandomInteger[{1, Rn}]; S = 0;
For[r = 1, r <= Rn, r++,
X[[p, r]] =
If[r != i, RandomReal[{-1, 1}], RandomChoice[{-1, 1}]];
S += X[[p, r]]^2];
X[[p]] *= Rb/Sqrt[S];
For[m = 1, m <= Pm, m++,
i = RandomInteger[{1, Rn}]; j = i;
While[i == j, j = RandomInteger[{1, Rn}]];
Xi = X[[p, i]];
Xj = X[[p, j]];
X[[p, i]] = s (Xj - Xi);
X[[p, j]] = s (Xj + Xi)]]; Return[X]]
, . , , , . , , .
, " " .
.
. , . , :
. : , . .
. , , N. O(N(N-N1)/2) O(N^2). , N^(1+1/D) , .
Diehard, Parking Test, "Numerous experiments prove" , , . , .
: , . , , , .
:
X, r, .. 2r :
(T(T-1))/2- , , Y :
, , . , , .
C# . , , Diehard .
- , "" . , , ParkingTest . . , . , , , .
, , . 10^8 , .
, , . , .
Inicialmente, estava interessado na questão da existência de uma fonte para o recebimento praticamente direto de números de ponto flutuante apenas aleatórios. Portanto, a natureza deste artigo é metódica, o algoritmo não pretende competir em desempenho com RNGs de hardware, e ainda mais com PRNGs aritméticos, pois contém, por exemplo, o cálculo da raiz, mas ainda pode ser usado como um duplicar ou depurar um.
Implementação de algoritmo em C #