O 161803398 é um número 'especial'? Por dentro do Math.Random ()

162

Eu suspeito que a resposta seja ' Por causa da matemática ', mas eu esperava que alguém pudesse dar um pouco mais de percepção em um nível básico ...

Eu estava bisbilhotando o código-fonte BCL hoje, observando como algumas das classes que eu usei antes foram realmente implementadas. Eu nunca tinha pensado em como gerar números aleatórios (pseudo) antes, então decidi ver como isso era feito.

Fonte completa aqui: http://referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

Esse valor MSEED é usado toda vez que uma classe Random () é propagada.

De qualquer forma, eu vi esse 'número mágico' - 161803398 - e não tenho a menor idéia do por que esse número foi selecionado. Não é um número primo ou uma potência de 2. Não é "meio caminho" para um número que parecia mais significativo. Eu olhei para ele em binário e hexadecimal e bem, parecia apenas um número para mim.

Tentei procurar o número no Google, mas não encontrei nada.

Rob P.
fonte
6
@ 48klocs: Diz isso nos documentos :The current implementation of the Random class is based on Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, second edition, 1981.
Jesse Good
4
@ 48klocs Sim, página 283 aqui: apps.nrbook.com/c/index.html Seu motivo parece ser "porque a matemática".
eshs 15/05
22
@eshs: Fato interessante: A página 283 do seu link é exibida inextp = 31;, mas o código-fonte da Randomclasse o exibe como se inextp = 21;alguém tivesse digitado errado, causando esse bug .
Jesse Good
7
@Izkata Precisamos educar os usuários sobre o comportamento correto (de não votar para fechar erroneamente) para o objetivo de longo prazo da qualidade do site, não apenas para o objetivo de curto prazo (de não ter uma pergunta específica fechada). E se eu não apontar os comentários acima, pode ter sido fechado como duplicado, porque as pessoas fazem isso às vezes.
Bernhard Barker

Respostas:

141

Não, mas é baseado em Phi (a "proporção áurea").

161803398 = 1.61803398 * 10^8  φ * 10^8

Mais sobre a proporção áurea aqui .

E uma muito boa leitura para o matemático ocasional aqui .

E eu encontrei um trabalho de pesquisa sobre geradores de números aleatórios que concorda com essa afirmação. (Veja a página 53.)

Matt Johnson-Pint
fonte
17
Você sabe por que um número baseado em Phi faz uma boa escolha como semente? Seria possível resumir isso aqui?
Bernhard Barker
29
@ Dukeling A constante é usada exatamente uma vez, para temperar a semente recebida. Minha forte suspeita é que ele foi escolhido para ser um número acima da manga que impede que sementes com poucos bits definidos (talvez uma escolha comum) atrapalhem o gerador de números aleatórios (em vez de alguma propriedade mágica do phi).
David Eisenstat
7
Para citar uma citação do referido livro De acordo com Knuth, qualquer MBIG grande e qualquer MSEED menor (mas ainda grande) podem ser substituídos pelos valores acima. Portanto, é divertido em matemática, mais ou menos. Portanto, a resposta correta deve ser: Não. Mas é baseada em Phi.
TAW
14
Basta dar uma olhada no papel de número aleatório - essa linha se destacou um pouco - "One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."(página 4) #
1116
2
Eu pensaria que uma maneira mais relevante de usar a proporção áurea seria usar (módulo / phi) em vez de usar uma representação da base 10 dos dígitos no código que nada tem a ver com a base 10. Uma característica interessante da phi que Não vi nessa página que, pelo que posso dizer, para qualquer número inteiro N, o valor N / phi-int (N / phi)> = 1 / N / sqrt (5). Isso significaria que, mesmo que se gerasse uma sequência de números N / phi-int (N / phi), a distância entre o par mais próximo estará dentro de um fator de sqrt (5) do maior espaçamento uniforme possível no intervalo ( 0..1)
supercat
62

Este número é obtido a partir da proporção áurea 1,61803398 * 10 ^ 8 . Matt deu uma boa resposta sobre qual é esse número, portanto, explicarei um pouco sobre um algoritmo.

Este não é um número especial para este algoritmo. O algoritmo é o algoritmo gerador de número aleatório subtrativo de Knuth e os principais pontos são:

  • armazenar uma lista circular de 56 números aleatórios
  • a inicialização é um processo de preenchimento da lista e, em seguida, randomiza esses valores com um algoritmo determinístico específico
  • dois índices são mantidos separados por 31
  • novo número aleatório é a diferença dos dois valores nos dois índices
  • armazenar novo número aleatório na lista

O gerador é baseado na seguinte recursão: X n = (X n-55 - X n-24 ) mod m, onde n ≥ 0. Este é um caso parcial de gerador de Fibonacci atrasado : X n = (X n-j @ X n-k ) mod m, onde 0 <k <j e @ é qualquer operação binária (subtração, adição, xor).

Existem várias implementações deste gerador. Knuth oferece uma implementação em FORTRAN em seu livro. Encontrei o seguinte código , com o seguinte comentário:

PARÂMETRO (MBIG = 1000000000, MSEED = 161803398, MZ = 0, FAC = 1.E-9)

De acordo com Knuth, qualquer MBIG grande e qualquer MSEED menor (mas ainda grande) podem ser substituídos pelos valores acima.

Um pouco mais pode ser encontrado aqui Observe que, na verdade, este não é um trabalho de pesquisa (como afirmado em Matemática), mas apenas uma tese de mestrado.

As pessoas em criptografia como para utilizar um número irracional ( pi, e, sqrt(5)), porque existe uma conjectura que algarismos de tais números aparece com a mesma frequência e, portanto, têm elevada entropia . Você pode encontrar esta pergunta relacionada na troca de pilha de segurança para saber mais sobre esses números. Aqui está uma citação:

"Se as constantes são escolhidas aleatoriamente, então com alta probabilidade, nenhum invasor será capaz de quebrá-lo." Mas os criptografadores, sendo muito paranóicos, ficam céticos quando alguém diz: "Vamos usar esse conjunto de constantes. Eu os escolhi aleatoriamente, juro ". Portanto, como compromisso, eles usarão constantes como, por exemplo, a expansão binária de π. Embora não tenhamos mais o benefício matemático de tê-los escolhido aleatoriamente a partir de um grande número de números, podemos pelo menos estar mais confiantes de que não houve sabotagem.

Salvador Dalí
fonte
5
Quanto ao atendedor, não é apenas por causa da entropia, é também porque esses números dobram como nada nos meus números de manga .
Cole Johnson