Os computadores não criam números aleatórios sem base, pois provavelmente o tempo é a base universal da aleatoriedade.
Quero que você crie um código que crie números aleatórios com estas regras:
- Não é permitido que o tempo seja a base, em qualquer ponto do programa.
- Funções aleatórias / pseudo-aleatórias predefinidas não são permitidas.
- Os números gerados podem estar em qualquer intervalo. Bem, pelo menos, dois inteiros diferentes: D
- Os números são repetidos.
popularity-contest
Dadan
fonte
fonte
Respostas:
Javascript
Foi divertido!
Eu escrevi o Mersenne Twister em JS. Então, percebi que tinha que obter uma semente de algum lugar.
Então, eu decidi que iria obtê-lo a partir da API Stack Exchange! (Eu poderia usar
localStorage
e incrementar um contador, mas isso não é divertido.) Então, peguei as 10 respostas ativas mais recentes e depois peguei a cada 4 ou menos dígitos consecutivos na resposta e os adicionei.Essas sementes são sempre diferentes, pois o Stack Overflow é atualizado constantemente (e minha cota continua diminuindo!) Os números incluem IDs de resposta, IDs de perguntas, pontuações, contagens de up / downvote, representantes / IDs de proprietários e os dados do wrapper (cota e tal ) Em uma corrida eu consegui
256845
, então270495
, e então256048
, etc ....Isso registra 10 números aleatórios de complemento de dois bits de 32 bits no console. Saída de amostra:
fonte
Java
A magia está no
public NoTimeRandom()
. Matrizes convertidas em strings podem confundir novos programadores, pois os números são aleatórios. Amostra (parachar[]
:[C@4a8e91eb
). Onext
método é copiado dejava.util.Random
.Saída de amostra:
Vamos testar a eficácia deste rng:
Na minha resposta a Approximate a Bell Curve , a geração de dados que usei depende de um bom rng. Vamos executá-lo com isso como o rng. Resultado:
Assim como eu pensava. Este é um rng bastante ruim.
fonte
C
Compile com o sinalizador -pthread (ou o que seu compilador usa).
Não tenho certeza se isso se qualifica ou não com base no padrão "tempo não é permitido", porque basicamente está usando o agendador como fonte de entropia, ignorando intencionalmente a segurança do encadeamento. Ele funciona usando uma função psuedo-aleatória bastante básica ( gerador de números aleatórios de Lehmer ) com uma semente inicial codificada. Em seguida, ele inicia 20 threads que executam o cálculo de Lehmer com um conjunto compartilhado de variáveis.
Parece funcionar bastante bem, eis algumas execuções consecutivas:
EDIT: Pensei um pouco mais e percebi que isso não é baseado em tempo. Mesmo com um planejador completamente determinístico, a entropia não vem dos intervalos de tempo - vem do carregamento de todos os processos em execução no sistema.
EDIT 2 Depois de me inspirar no @Quincunx postando uma curva em sino, coloquei 12MB de aleatoriedade em um arquivo e enviei -o para o CAcert . Ele falhou em todos os testes obstinados, mas obteve um respeitável 7.999573 de 8 no teste ENT (apenas potencialmente determinístico). Curiosamente, dobrar a contagem de threads piorou.
fonte
C
Ele gera um número aleatório no intervalo de 0 a 255, usando a semente de https://stackoverflow.com/questions usando
wget
.Exemplo de execução:
fonte
C ++
resultado
quaisquer 5 números aleatórios
três amostras
fonte
11230576, 0, 11206992, 0, 2053725299
que ainda não me parecem aleatórias.perl
O que é todo esse lixo com a obtenção de sementes pela internet? Parece trapaça para mim ;-) Prefiro dar minha semente a uma função hash criptográfica e fornecer saída no intervalo de 0 a 2 ^ 160-1 da seguinte forma:
Sempre que você tem entropia de qualidade incerta, uma maneira de distribuí-lo com mais regularidade (mas não aumenta sua qualidade!) É canalizá-lo para tipos como SHA1 ou MD5, como fiz aqui. Para sementes pré-hash, usei pid e o endereço de uma referência aleatória. É claro que você poderia adicionar outras entradas para obter mais entropia, por exemplo, no x86, você pode usar o TSC - (mas inserir código de montagem em perl é um pouco difícil, então eu pulei).
Se você quiser ter uma saída diferente da do cara no próximo computador, basta ajustar "some_salt" para ser uma string do seu agrado. Ou deixe de fora se você é um minimalista =)
fonte
Java
Minha solução abusa do
hashCode()
método deObject
classe.Saída de amostra:
Motivado por outras respostas que demonstram a aleatoriedade da solução, mudei minha solução para retornar os 16 bits do meio
int
retornados porObject.hashCode()
.Gerei um arquivo de 19 MB (consistindo em 10 7
short
) e o enviei ao CACert . Aqui está a captura de tela do resultado (ele foi editado para ficar bonito, mas os números são deixados como estão):Fiquei surpreso com o resultado, pois ele registra 7.999991 no teste de entropia e passou (?) Em todos os 7 testes de Diehard.
fonte
Javascript
Gerando aleatório com o movimento do mouse do usuário
Últimos cinco dados copiados:
9637090187003
7828470680762
6045869361238
4220720695015
2422653391073
fonte
Bash, intervalo: ints entre 0 e 1
fonte
echo -n & echo $!
vai fazer, mas ser um RNG muito ruim. Você também pode alterar 2 com qualquer outro número, mas quanto maior o número, pior fica a "aleatoriedade".Rubi
Infelizmente, apenas para Mac. Usamos
sox
para extrair bytes do microfone (como uma corda, ahem ...), invertê-lo para obter o cabeçalho de status no final (* tosse *), cortá-lo, cortá-lo, tirar o MD5 dos pedaços , abandone os caracteres não numéricos do hash, adicione os inteiros largish restantes, cole um0.
na frente, converta em um flutuador, pronto.Gera flutuadores de comprimento variável no intervalo
0..1
.fonte
C
Gerando aleatoriamente usando o ID do processo.
Saída de amostra:
fonte
GIRAR
Se isso fosse código de golfe , eu venceria!
fonte
Pitão
A concisão de Python nunca deixa de surpreender. Como usar a imagem aleatória de imgur aparentemente não é válida, usei uma grande fonte de aleatoriedade: o bate-papo de stackoverflow!
5 ensaios:
Não é verdadeiramente aleatório, mas, novamente, nenhuma delas é.
fonte
whatever.com/random
perl
Eu vi muitas respostas que fizeram solicitações HTTP, o que parece um desperdício para mim, porque, sob as cobertas, há números aleatórios sendo transmitidos pela rede. Então, decidi escrever um código para passar um em um nível mais baixo:
Dá portas aleatórias no intervalo 0..65535, teoricamente. Na prática, existem várias portas que você nunca verá, portanto a distribuição está longe de ser perfeita. Porém, é AFAICT a quantidade mínima de trabalho que você pode fazer para obter alguma entropia de um host remoto que tenha uma porta aberta.
PS - O tratamento de erros é deixado como um exercício para o leitor ;-)
fonte
C
fonte