Um gerador de números aleatórios pode produzir uma saída diferente, considerando sementes idênticas?

10

O título resume tudo. Estou interessado em saber se existe um algoritmo capaz de produzir saída variável com entrada idêntica sem depender de outras fontes de aleatoriedade, como DateTime.Agora ou um número gerado a partir de um sensor de luz etc. Além disso, o algoritmo não pode ser executado em sequência, apenas duas execuções distintas e não relacionadas que produzem saídas diferentes.

ConditionRacer
fonte
O que você está falando é sobre um gerador de números aleatórios pseudo, para ser específico.
Marcel
A maioria dos idiomas permite a possibilidade de instanciar um gerador de números aleatórios sem precisar especificar a semente para que a semente também seja "aleatória". Há uma razão pela qual as sementes são usadas.
1140 Neil
1
@ Neil: nesses casos, ainda há uma semente, é apenas implícita, geralmente a hora do sistema.
22613 Michael Borgwardt
@ MichaelBorgwardt, eu simplesmente disse que a semente também seria aleatória. É claro que nada é verdadeiramente aleatório, mas geralmente o tempo do sistema fornece uma semente decente, desde que você não instancia um gerador de números aleatórios sem passar uma semente; nesse caso, você pode obter a mesma semente "aleatória" duas vezes.
Neil
Há uma área de pesquisa interessante sobre hardware inexato, que possui uma imprecisão estatisticamente bem definida. O benefício potencial é um menor consumo de energia. Apenas calcular 2.0 + 2.0esse sistema não daria resultados idênticos. Não precisa de outra fonte de aleatoriedade.
MSalters

Respostas:

15

Estou interessado em saber se existe um algoritmo capaz de produzir saída variável com entrada idêntica sem depender de outras fontes de aleatoriedade, como DateTime.Now ou um número gerado a partir de um sensor de luz etc.

Não, isso é fundamentalmente impossível, porque a própria definição de um algoritmo é que ele é bem definido e determinístico, ou seja, dado que a mesma entrada sempre produzirá a mesma saída. Existem algoritmos aleatórios, mas eles requerem aleatoriedade como entrada.

Além disso, o determinismo é o objetivo de design mais importante do hardware do computador. Uma CPU que não produz a mesma saída, dada a mesma entrada, seria totalmente inútil para a maioria dos propósitos.

Michael Borgwardt
fonte
14

Não, um algoritmo de geração de número pseudo-aleatório sempre produzirá a mesma saída, dada a mesma semente (portanto, pseudo- aleatório).

Acho interessante que você tenha usado o termo "algoritmo" em vez de "programa". Isso exclui uma certa classe de respostas yes (erros leves na RAM, intercalações de encadeamentos diferentes em um RNG com vários encadeamentos, etc.). Se você considerar que cada execução do seu algoritmo recebe a mesma entrada em cada iteração é bem especificada sem aleatoriedade, ela gerará a mesma saída em cada execução.

Dito isto, até coisas básicas como a temperatura da CPU são imprevisíveis o suficiente para agir como uma fonte de entropia, se forem normalizadas adequadamente. Portanto, não pense que isso implica que um gerador de números aleatórios "criptograficamente seguro" possa ser previsto se você souber a que horas ele foi executado; muitos deles usam alimentação de entropia gerada pelo sistema.

Brian
fonte
Algoritmo era a palavra certa :) Estou tentando especificamente eliminar fontes externas de entropia, falhas de memória, ordem de threads, entrada imprevisível, como uma fonte de luz etc. Acho que minha pergunta decorre da minha falta de compreensão de algoritmos aleatórios e talvez Eu poderia ter tornado a pergunta mais genérica. Estou realmente me perguntando se é possível criar qualquer função que retorne resultados diferentes, com entradas idênticas (incluindo todas as fontes de entropia). Parece que a resposta é não
ConditionRacer
7

Você sabia que as pessoas trabalham duro para garantir que, dada a mesma semente, a mesma sequência de números aleatórios seja produzida sempre? Essa é uma propriedade desejável para coisas como a simulação de Monte Carlo, pois significa que os resultados são totalmente reprodutíveis. Se você não especificar a semente, algo como o tempo será usado, mas essa reprodutibilidade exata é realmente necessária.

Os únicos RNGs onde isso é realmente indesejável são aqueles usados ​​para criptografia, e os que normalmente conseguem isso usam a fonte de números aleatórios do sistema operacional (que não é rebobinável em circunstâncias normais e que pode usar hardware sofisticado) para fornecer sua semente.

Donal Fellows
fonte
Sim, entendo o que você está dizendo. Não estou tentando implementar nada de novo, isso foi apenas uma curiosidade tarde da noite.
ConditionRacer
1

Suponho que, se você implementasse o algoritmo em diferentes plataformas de hardware e usasse técnicas como extrair os N bits do meio de um número inteiro, é possível obter respostas diferentes se a codificação do número inteiro fosse diferente (grande / pequeno / médio-final). Você também pode ter problemas executando em máquinas com FPUs em comparação com aqueles que não o fazem se estiver manipulando números de ponto flutuante. Provavelmente não é um problema em máquinas de classe desktop, mas pode ser um problema em telefones.

TMN
fonte