Por que é impossível produzir números verdadeiramente aleatórios?

47

Eu estava tentando resolver um problema de hobby que exigia a geração de um milhão de números aleatórios. Mas rapidamente percebi que está se tornando difícil torná-los únicos. Peguei o Algorithm Design Manual para ler sobre geração de números aleatórios.

Ele tem o parágrafo a seguir que eu não sou totalmente capaz de entender.

Infelizmente, gerar números aleatórios parece muito mais fácil do que realmente é. De fato, é fundamentalmente impossível produzir números verdadeiramente aleatórios em qualquer dispositivo determinístico. Von Neumann [Neu63] disse o melhor: “Qualquer um que considere métodos aritméticos de produção de dígitos aleatórios está, é claro, em um estado de pecado.” O melhor que podemos esperar são números pseudo-aleatórios, um fluxo de números que aparece como se eles foram gerados aleatoriamente.

Por que é impossível produzir números verdadeiramente aleatórios em qualquer dispositivo determinístico? O que está frase significa?

Vinoth Kumar CM
fonte
86
Você está realmente perguntando por que não pode produzir um número verdadeiramente aleatório em um dispositivo determinístico ? A pergunta já não inclui a resposta?
Herby
37
Se todos os números gerados tiverem que ser únicos, eles não serão realmente aleatórios. É perfeitamente possível que um verdadeiro gerador de números aleatórios dê o mesmo resultado dez vezes seguidas.
TMN
28
Há uma falha na procura de números aleatórios que são únicos . Se você está restringindo os números a serem únicos , eles não são aleatórios, pois o aleatório exige a possibilidade de repetição, por mais improvável que seja.
Mark Booth
13
Fora do computador, algum número aleatório é verdadeiramente aleatório? Jogue um dado, é física com muitos vetores.
MPelletier
9
@ MPelletier: Não é bem assim. A mecânica quântica pode (uma vez que os cientistas descobriram mais sobre isso) implicar a existência de uma aleatoriedade verdadeira, dependendo da sua definição de aleatoriedade.
Brian #

Respostas:

65

Deve-se procurar um gerador de números pseudo-aleatórios criptograficamente seguro . A maioria dos PRNG são geradores de congruência linear (também next numberé uma função linear de previous number), portanto, se você plotar next numbervs, previous numberobterá um gráfico de linhas paralelas. Um CSPRNG não fará isso. A desvantagem é que eles são lentos.

Eu agrupo geradores de números aleatórios em 3 categorias :

  1. Bom o suficiente para trabalhos de casa.
  2. Bom o suficiente para apostar em sua empresa.
  3. Bom o suficiente para apostar no seu país.

Por que é impossível produzir números verdadeiramente aleatórios em qualquer dispositivo determinístico?

Um dispositivo determinístico sempre produzirá a mesma saída quando recebidas as mesmas condições e entradas de partida - é isso que significa ser deterministic. "Número verdadeiramente aleatório" é mais um ponto de vista filosófico, pois o que significa ser randomo cerne do olhar filosófico do umbigo (as pessoas nem têm certeza se a decadência atômica é aleatória ou segue algum padrão que simplesmente não conseguimos descobrir. ainda). Um gerador de números aleatórios criptograficamente seguro precisará de uma fonte externa de entropia para tornar o dispositivo não determinístico.

Tangurena
fonte
1
É por isso que é impossível obter um número verdadeiramente aleatório. Mesmo que a seqüência nunca se repete, o que não é garantido para aleatórios números, um outro funcionamento do programa com as mesmas entradas irá produzir os mesmos resultados. Portanto, alguém pode reproduzir seus números aleatórios posteriormente, o que significa que não foi realmente aleatório.
Spencer Rathbun
2
@ user973810 O problema com essa definição da teoria da informação é que você não pode exibir uma instância real de uma sequência aleatória. Podemos provar, para qualquer linguagem de definição razoável, que quase todas as seqüências infinitas (em um sentido técnico) são aleatórias, porque não podem ser descritas na linguagem. O que é mais útil é o conceito de um gerador de sequência aleatória: não aquele que produz uma sequência aleatória, mas aquele que produz uma sequência aleatoriamente.
Gilles 'SO- stop be evil'
13
Um pouco de nitpick: algumas pessoas, como físicos nucleares e de partículas, têm certeza de que processos como o decaimento atômico são realmente aleatórios.
David Z
9
@ David: Podemos ir um pouco mais longe do que isso mesmo. Os vários experimentos sobre a desigualdade de Bell mostram que certos processos quânticos são definitivamente imprevisíveis . Eles podem ser aleatórios em algum sentido filosófico ou podem depender de variáveis ​​ocultas não locais, mas ambos os casos impedem previsões confiáveis.
dmckee
7
@dmckee: sim, eu imaginei que seria mais fácil ficar longe de tentar explicar a conexão entre a desigualdade de Bell e o colapso da função de onda nos comentários sobre prog.SE. As pessoas sempre podem vir ao nosso site se estiverem curiosas ;-) Tangurena: verdade, Einstein disse isso, mas isso só significava que ele realmente queria que o universo fosse determinístico. Não é, no entanto. Experimentos realizados após a morte de Einstein mostraram isso de maneira bastante conclusiva (exceto as variáveis ​​ocultas não locais, também conhecidas como estranhezas ). Só porque ele é Einstein não significa que ele estava certo sobre tudo.
David Z
22

A verdadeira aleatoriedade implica não-determinismo. Se é determinístico, pode ser previsto com precisão (é isso que determinismo significa); se pode ser previsto, não é aleatório.

A melhor coisa que você pode obter de um gerador de números pseudo-aleatórios determinísticos é um fluxo de números que possui um ciclo muito longo (não é possível repetir a menos que seu dispositivo RNG tenha armazenamento ilimitado) que, durante o ciclo, produz um números de fluxo que atendem a todas as outras propriedades de uma sequência aleatória (uma distribuição uniforme de valores sendo a mais interessante).

Para resolver esse problema, muitos UNIXes modernos e similares ao Unix têm RNGs de kernel que usam fontes de ruído físico para gerar uma verdadeira aleatoriedade.

Outra abordagem comum é considerar o tempo atual como a semente de um RNG determinístico ( srand(time(NULL));em C); criptograficamente falando, isso não vale nada, já que o tempo atual não é segredo, mas para coisas como simulações físicas ou videogames, é bom o suficiente.

tdammers
fonte
Observe que a não repetição também é impossível para qualquer gerador com valor de saída limitado (número limitado de bits). Mas é claro que a duração do ciclo de um gerador determinístico é provavelmente muito menor do que o máximo teórico, que é todas as permutações possíveis.
9000:
@ 9000: Claro que isso não é verdade. Pegue um número irracional e use os dígitos (qualquer base) como sua sequência "aleatória". Estrondo! sequência não repetida (por definição) e ainda limitada (à sua base).
ThePopMachine
@ThePopMachine: você pode gerar uma sequência não repetitiva de bits de qualquer comprimento, equivalente a uma sequência não repetida de números de comprimento ilimitado. Você não pode gerar uma sequência não repetida de números inteiros de magnitude limitada (por exemplo, 32 bits); depois de gerar todas as permutações de valores de 32 bits, uma sequência deve ser repetida. Você está certo; estamos apenas falando de coisas diferentes.
9000
@ 9000: Sem doninha. Você fez uma declaração geral que é falsa. Se você está realmente tentando, não há mais que n ^ k diferentes seqüências de comprimento k para n valores diferentes e, portanto, deve repetir, isso é bastante óbvio e não é interessante.
ThePopMachine
2
@ThePopMachine: Eu apreciaria se você diminuísse um pouco. Para citar, «não repetir também é impossível para qualquer gerador com valor de saída limitado (número limitado de bits)». O que você fala explicitamente é um número ilimitado de bits, como uma sequência de dígitos [binários] de um número irracional. Sua afirmação, embora verdadeira, não tem relação com o problema.
9000
10

O segundo capítulo do livro Simulação de Eventos Discretos: Um Primeiro Curso de Lawrence Leemis fornece uma introdução fantástica aos geradores de números aleatórios (ou, mais precisamente, aos geradores de números aleatórios psuedo).

Um trecho de seu livro explica bem na minha opinião:

Historicamente, três tipos de geradores de números aleatórios têm sido defendidos para aplicações computacionais: (a) geradores de consulta de tabela no estilo dos anos 50, como, por exemplo, a tabela corporativa da RAND com um milhão de dígitos aleatórios; (b) geradores de hardware como, por exemplo, dispositivos térmicos de "ruído branco"; e (c) geradores algorítmicos (de software). Desses três tipos, apenas geradores algorítmicos alcançaram ampla aceitação. A razão para isso é que apenas geradores algorítmicos têm o potencial de satisfazer todos os seguintes critérios de geração de números aleatórios geralmente bem aceitos. Um gerador deve ser:

  • random - capaz de produzir resultados que passam em todos os testes estatísticos razoáveis ​​de aleatoriedade;
  • controlável - capaz de reproduzir sua saída, se desejado;
  • portátil - capaz de produzir a mesma saída em uma ampla variedade de sistemas de computador;
  • eficiente - rápido, com requisitos mínimos de recursos do computador;
  • documentado - teoricamente analisado e extensivamente testado.

Portanto, embora seja possível usar um gerador de ruído branco para obter números aleatórios "melhores", eles não obtiveram aceitação porque não seguem a maioria dos critérios acima.

Eu recomendaria que você pusesse as mãos em uma cópia desse livro (ou em algo semelhante). Entender exatamente como o trabalho do PRNG definitivamente o ajudará em seus esforços.

riwalk
fonte
7

Porque você precisa escrever um código para gerar os números aleatórios e o código NÃO é aleatório. (É determinista)

Então você começa com um "Valor inicial (es)" escolhido em "Aleatório" (geralmente o horário atual) e o usa em um algoritmo para começar a gerar números. Mas todo o conjunto é baseado no valor original da Semente!

Portanto, se você executar seu código novamente com os mesmos valores de semente, obterá exatamente o mesmo conjunto de números! Como alguém razoavelmente pode chamar isso de aleatório? Mas com certeza faz OLHE aleatória.


Em relação a torná-los únicos, depois de gerar um número, basta verificar se você já tem esse número, se tiver, jogue-o fora e gere um novo.

Idiotas
fonte
13
No lado positivo, números pseudo-aleatórios repetíveis podem ser ótimos para depuração.
David Thornley
5

Como você está gerando números aleatórios, você deve esperar que os valores gerados sejam não exclusivos. Essa é uma propriedade da aleatoriedade - você não pode dizer que uma sequência de números verdadeiramente aleatórios (ou mesmo pseudo-aleatórios) é única, porque esse requisito permitiria a previsão do valor final no intervalo, além de alterar a probabilidade de todos os números não escolhidos cada vez que um novo é selecionado.

James McLeod
fonte
1
Este é realmente um comentário e não uma resposta, pois na verdade não responde à pergunta .
Mark Booth
5

Eu tenho uma definição muito simples de Pseudo Random :

Muitas variáveis ​​desconhecidas para prever.

Eu também tenho uma definição simples de True Random :

Variáveis ​​desconhecidas infinitas.

O problema com um computador é que ele sempre conhece TODAS as variáveis. O número aleatório é simplesmente uma função matemática de algum valor inicial .
O melhor que podemos fazer é fornecer ao computador um valor de semente pseudo-aleatório, que geralmente é baseado em uma variável que não podemos prever (como tempo exato).

Mesmo que um computador seja absolutamente incapaz de criar um número aleatório, é bom introduzir muitas variáveis ​​para prever!

Scott Rippey
fonte
1
Bem, "tempo" é um mau exemplo de algo que não pode ser previsto. Por outro lado, o movimento do mouse, a entrada do microfone etc. são entradas que não são previsíveis.
HoLyVieR
3

Na verdade, não é possível gerar números verdadeiramente aleatórios no software , como outros já apontaram, mas é possível com o hardware construir um dispositivo que possa gerar números verdadeiramente aleatórios *. Existem muitos exemplos disso na Internet, e há uma variedade de métodos usados, desde a leitura do tempo entre os carrapatos no contador Geiger até a amostragem do ruído branco (principalmente a radiação de fundo do universo) de um receptor não sintonizado. Eu mesmo construí alguns usando alguns dos métodos disponíveis.

* Qualquer bom geek da física indicará que, dada a maneira como o universo opera, nada disso é hiper-tecnicamente verdadeiramente aleatório, mas não há uma maneira razoável de prever os resultados, portanto, para o bem dessa discussão, eles são suficientes.

Unkwntech
fonte
5
Como um geek de meio período da física, os geradores baseados em eventos quânticos são (até onde pudemos perceber) realmente aleatórios. Pessoas que não gostam da aleatoriedade tentam tirar a aleatoriedade da mecânica quântica desde o início, e tudo o que é feito é acumular mais evidências de que é verdadeiramente aleatória.
David Thornley
@DavidThornley, ... até que alguém descubra a fórmula.
CaffGeek
1
@ Chade: Não há fórmula no sentido usual; isso foi descartado pelos experimentos de EPR. Certamente é concebível que tudo seja determinístico, mas não de maneira facilmente compreensível.
David Thornley
@ DavidThornley, eu sabia que essa era a palavra errada a ser usada. Acho que sabemos o que eu estava tentando dizer. Quase sempre que alguém diz que algo é impossível, alguém acaba por provar que está errado. É da natureza humana.
CaffGeek
2
É como dizer que, eventualmente, alguém irá fabricar uma máquina capaz de resolver o problema da parada porque alguém disse que isso era impossível. Não se trata de encontrar a equação, ela é aleatória de acordo com todos os experimentos realizados e com a matemática que a respalda.
Alex
2

Não há como você produzir um número aleatório sem um hardware especial. No meu primeiro ano, alguns colegas de classe e eu propusemos um gerador de números aleatórios que tivesse basicamente um receptor AM e sintonizado em 4 canais diferentes, coloque a entrada em um conversor A para D e adicione todos eles (module seu número máximo). Como a combinação de entrada analógica de qualquer número arbitrário de estações é aleatória e poderíamos produzir um grande número de números aleatórios a partir do conversor A2D, propusemos que este poderia ser um bom gerador. Certamente, mesmo isso não é verdadeiramente aleatório em um sentido filosófico, embora, para a maioria dos propósitos práticos, isso possa funcionar.

Balaji Viswanathan
fonte
2

O determinismo é essencialmente uma função. Lembre-se de Álgebra que uma função é uma correspondência entre um domínio e um intervalo, de modo que cada membro do domínio corresponda exatamente a um membro do intervalo.

Portanto, se f (x) = z, f (x)! = Y, a menos que y seja z. Essa é uma função. Imagine JavaScript:

function Add(A, B) {
      return A + B;
}

var addedNumber = Add(2,3);//returns 5
addedNumber = Add(2,3);//still 5

Não importa quantas vezes você chame, Add(2,3)ele sempre retornará 5. Em outras palavras, Add () é uma função determinística.

Fatores externos podem fazer o Add se comportar de maneira não determinística. Por exemplo, se você introduzir multithreading na equação. A contribuição humana também causa não determinismo.

Agora, é aqui que as coisas ficam interessantes.

"Qualquer um que considere métodos aritméticos de produzir dígitos aleatórios está, é claro, em estado de pecado."

Nota Von Neumann afirma, "métodos aritméticos de produção [...]". Não se trata de dados humanos, simultaneidade, velocidade de amostra de vento lida por um instrumento preciso ou outras formas não algorítmicas de produzir dados aleatórios para uma função determinística.

Isso simplesmente afirma que uma função ou sistema de funções não se tornará subitamente determinístico. Em outras palavras, Add (2,3) não retornará, de alguma forma, 6 ou nada além de 5, com as mesmas entradas . Isso é impossível.

O autor da citação dá um passo adiante.

O melhor que podemos esperar são números pseudo-aleatórios, um fluxo de números que aparecem como se fossem gerados aleatoriamente.

O contexto é definido anteriormente como "em qualquer dispositivo determinístico". Eu poderia terminar a discussão aqui. Mas, e se mudarmos o contexto, introduzindo um novo elemento no sistema? Um elemento não determinístico adicionado como entrada torna o sistema um sistema não determinístico. Embora, removendo o elemento não determinístico, reduzamos de volta a um sistema determinístico. Se, de alguma forma, podemos rastrear ou reproduzir as entradas, podemos reproduzir um resultado. Mas este parágrafo inteiro é tangencial ao que o autor está dizendo. Lembre-se do contexto.

Pode-se discutir sobre o significado do não-determinismo. Mais uma vez, tangencial. Lembre-se do contexto.

Então ele está correto. Em qualquer dispositivo determinístico , é impossível para um sistema determinístico produzir um verdadeiro resultado aleatório.

P.Brian.Mackey
fonte