Sua tarefa é improvisar um gerador de números aleatórios de hardware com o hardware que você tem.
Desafio
Escreva um programa com as seguintes propriedades:
- Imprime um
0
ou1
(e nada mais). - A saída depende de um processo físico e não apenas do estado interno do computador.
- Não há relação entre as saídas das execuções subsequentes (com um minuto de diferença).
- A saída não é previsível com nenhum esforço realista.
- A probabilidade de a saída estar
0
entre 0,2 e 0,8. - É executado em menos de um minuto, com uma probabilidade razoavelmente alta.
Você deve explicar por que seu programa possui essas propriedades, se não for óbvio.
Esclarecimentos e Restrições
A seguir, pode parecer uma enorme quantidade de restrições para um concurso de popularidade, mas ultimamente é tudo para garantir que o programa permaneça dentro do espírito da pergunta, funcione um pouco e para evitar soluções que são populares devido a um exagero total, mas são ultimamente entediante.
- A hora do sistema não conta como um processo físico.
- Você pode usar qualquer hardware de nível de consumidor que desejar, desde unidades de disco floopy de 8 polegadas a um lançador de foguetes USB e fones de ouvido - a menos que seja destinado à geração de números aleatórios. Uma peça de hardware é do tipo consumidor, se é produzida em massa e custa menos de 1000 $ / € / £, portanto você não pode usar radiotelescópios, CERN, MRIs ou seu detector de partículas construído em casa.
- Você só pode fazer as suposições mais básicas sobre o estado e o alinhamento do hardware, como estar ligado (se houver um interruptor de energia) e estar adequadamente instalado e funcional. Por exemplo, você pode supor que uma unidade de CD seja geralmente capaz de ler um disco e não ficar congestionada, mas não pode assumir que ela esteja aberta ou fechada ou que contenha um disco. Em outro exemplo, você não pode assumir que duas peças de hardware estejam alinhadas para permitir uma interação especial, mas você pode presumir que elas estejam na mesma sala.
- Você pode deixar o hardware no estado que desejar, a menos que o quebre.
- Você pode e deve assumir que o hardware esteja em um ambiente natural, mas nada mais. Por exemplo, você pode assumir que o hardware não está posicionado em um tanque de hélio líquido, nem em uma sala extremamente à prova de som e luz, nem no espaço. No entanto, você não pode assumir que fontes de som e luz estejam presentes, exceto aquelas que são evitáveis apenas com esforços radicais.
- Seu programa deve ser executado em um computador desktop padrão com um sistema operacional não esotérico de sua escolha. Você pode empregar qualquer software que não seja projetado especificamente para geração de números aleatórios.
- Você não pode assumir acesso à Internet.
- Você não pode assumir que os humanos estejam presentes ou ausentes, mas você pode assumir que ninguém interfere intencionalmente com o seu programa, por exemplo, parando manualmente um ventilador ou executando um programa que não faz nada além de desligar o microfone o mais rápido possível.
- Você pode apenas fazer as suposições mais básicas sobre as configurações do software. Por exemplo, você pode assumir que os drivers estejam instalados e ativados, mas você deve estar preparado para que o som seja silenciado.
- Você pode deixar as configurações do software no estado que desejar.
Bônus
Uma recompensa especial foi concedida a uma solução particularmente curta. Isso foi mais pelo número de instruções e similar do que pelos caracteres. Os vencedores foram (empatados de acordo com meus critérios):
- Esta resposta por Franki.
- Esta resposta de Tejas Kale.
Eu só pude atribuir uma resposta e a resposta de Tejas Kale venceu por sorteio.
fonte
Respostas:
Concha
Lê uma única amostra do fluxo do microfone e imprime seu bit menos significativo, que deve ser dominado pelo ruído.
EDIT: Alterado para ativar o som do microfone ... e tudo o mais!
fonte
cat /dev/urandom > /dev/dsp
, caso o computador esteja em uma sala / câmara / caixa / gabinete / espaço à prova de som.Bater
Reúne entropia a partir do tempo de resposta de um único ping para o host local.
Observe que o tempo de resposta aparece exatamente três vezes na saída de
ping -qc1
:Todos os outros números são constantes e - mais importante - independentes do tempo de resposta.
sed 's/[^1-9]/+/g'
converte todos os zero e não dígitos em sinais de adição eecho $[...0&1]
imprime a paridade da soma resultante.fonte
CYGWIN_NT-6.2-WOW64 work 1.7.28(0.271/5/3) 2014-02-09 21:06 i686 Cygwin
-ping
não tem nem-q
ou-c
aqui.ping
confirmado. Estou surpreso.JavaScript + HTML5 DeviceMotion
JSFiddle aqui .
Usa a API DeviceMotion HTML5 em dispositivos suportados (principalmente dispositivos móveis). Transforma o
acceleration
objeto resultante em JSON, faz o hash e pega o restante do módulo 2.A maior parte do código é a função hash (maldito seja JavaScript, e sua total falta de uma biblioteca padrão). Provavelmente poderia ser mais curto, mas sou um otário por uma boa função de hash.
fonte
Python + Webcam
Usar o código roubado descaradamente a partir daqui , tira uma foto usando sua webcam, faz o hash dos dados e imprime o bit menos significativo.
fonte
Perl
Verifica o tempo de resposta do seu disco rígido, cronometrando três operações:
Finalmente, o tempo gasto é empacotado como um flutuador e o 11º bit mais significativo é usado (o segundo bit mais significativo da mantissa).
fonte
Bater
sensors
imprime as temperaturas atuais do sistema, juntamente com a velocidade do ventilador.sed 's/[^1-9]/+/g'
converte todos os zero e não dígitos em sinais de adição e eco$[...0&1]
exibe a paridade da soma resultante.Regex e cálculo de paridade foram emprestados da resposta de dennis.
fonte
Bater
Usa tudo, apenas no caso de ...
Depende de
/sys
ou/proc
)/proc/<pid>/s*
(por exemplo, sched / schedstat) dependem da velocidade do hardware necessário para dar vida a esses processos.O tempo de execução no meu sistema é de ~ 10s, mas pode variar bastante. Especialmente, não execute isso como root ou, pelo menos, modifique-o para excluir
/proc/kcore
(a menos que você esteja disposto a gastar muito tempo para incluir a entropia contida nele, o que provavelmente incluiria tudo)fonte
Shell + Wi-Fi
Coloca o cartão wi-fi no modo monitor, despeja 30 segundos em pacotes recebidos (incluindo dados criptografados ilegíveis de redes vizinhas), pega o hash sha512 dos dados do pacote e retorna 1 se a primeira letra do hash for 0-7 . Supõe que seu cartão wi-fi seja
wlan0
e que você não possui ummon0
dispositivo no momento.Se não houver dispositivos wi-fi próximos, a saída será previsível, pois sempre será a mesma.
fonte
Os modernos processadores compatíveis com o 8086 fabricados pela Intel contêm um periférico de fácil acesso que gera aleatoriedade adequada. A condução desse periférico é feita usando a
rdrand
instrução que gera um padrão de bits aleatório ou define o sinalizador de transporte se o periférico estiver indisponível ou fora da entropia.O seguinte programa curto para o 80386 Linux verifica se o periférico está disponível por meio da
cpuid
instrução e tenta gerar um número aleatório. Se o número periférico ou aleatório não estiver disponível, o programa terminará com um status de1
. Se um número aleatório puder ser gerado, a1
ou a0
é impresso e o programa termina com o status de saída0
.Salvar como
rand.s
e montar comAqui está a montagem inteira:
E um despejo dos 77 bytes de código de máquina resultantes:
fonte
rdrand
não é um gerador de números aleatórios. É um periférico feito para a NSA mexer com a criptografia das pessoas.bater
Visando o método de coleta de números aleatórios mais desnecessariamente caro. Tempo quanto tempo leva para gerar emacs um milhão de vezes, depois use o truque de Dennis para transformar o tempo gasto em um único booleano (leva cerca de 7 segundos na minha máquina).
fonte
Arduino Mega1280
edit: versão atualizada que é robusta contra ter qualquer coisa conectada aos pinos. A idéia baseia-se no fato de que o ATMega1280 usa um oscilador interno separado para o oscilador de vigilância. Simplesmente configurei uma interrupção de watchdog que define um sinalizador, tenho um contador baseado no relógio do sistema (no Arduino, este é um cristal externo de 16MHz) e permito que o jitter / variação do relógio faça o trabalho.
fonte
Javascript
http://jsfiddle.net/prankol57/9a6s0gmv/
Toma entrada de vídeo.
Você pode ver a captura de tela usada para calcular o número aleatório.
fonte
Shell no Linux
Meça a velocidade de leitura de um disco rígido + o tempo de acesso de um diretório atualizado com freqüência neste disco, cujo layout é imprevisível.
requer:
Essa abordagem tem a vantagem de não modificar nenhum dado no sistema e não exigir perl sobre o do primo.
fonte
Concha
Testado no Linux, mas talvez o seu U * IX também possua / proc / stat?
Isso inicia apenas um único processo adicional, lê apenas um único arquivo adicional (nem mesmo no disco) e possui 37 caracteres. Também é bem rápido.
Pode-se pensar que isso é determinado por todos os estados do processo do kernel e da terra do usuário, mas esse não é o caso, já que / proc / stat também inclui tempo de espera de E / S, tempo para corrigir interrupções de hardware, tempo gasto na tarefa inativa e outros que todos depende da entrada de hardware externo.
fonte
Matlab
A solução do microfone:
Grava 10 segundos de som, localiza o número de amostras negativas na gravação e gera 0 se esse número for par e 1 se for ímpar. Assim 0 com 50% de probabilidade. A abordagem significa que mesmo pequenas quantidades de ruído, inevitáveis em uma gravação silenciosa, serão suficientes para gerar uma saída aleatória. O código um pouco mais longo a seguir acelera o gerador de números usando uma gravação mais curta, compensada com uma taxa de bits mais alta, o que gera mais ruído.
Em um teste em condições silenciosas, acho que em 100 execuções do último código, o código gera zero 51 vezes. 100 corridas em condições ruidosas produzem zero 40 vezes.
Edit: Obrigado a Emil por apontar uma falha no código original :-)
fonte
Bater
(Obrigado, Dennis.)
fonte
w
mostra uma lista de usuários conectados, que podem estar vazios. A carga do sistema é baseada no comprimento da fila da CPU.w
portop
.Toma o bit menos significativo do acelerômetro do computador (precisa do
hdaps
módulo Linux):Isso basicamente mede o ruído do sensor.
fonte
SmileBASIC
Usa o sensor de movimento do 3DS. O eixo Z do acelerômetro geralmente é de cerca de -1 (devido à gravidade) e, devido ao ruído aleatório, às vezes pode estar acima ou abaixo dele.
Aqui está um que usa o microfone:
fonte
Bater
Peguei a sugestão de Soham (usando
top
):Edit: Funciona da mesma maneira que Soham. Ele transforma todos os caracteres não numéricos na saída de top em '+' e, em seguida, elimina a paridade da sequência resultante.
o sinalizador 'b' para cima executa-o no modo em lote, para que ele relate todos os processos, não apenas a primeira tela e 'n1' diz para executar apenas uma iteração da parte superior.
fonte