O desafio:
Gere uma sequência aleatória de números. A única entrada deve ser o comprimento da sequência.
Pontos de internet extras para soluções puramente funcionais.
Nota: Esta é uma pergunta de controle de código . Por favor, não leve a sério a pergunta e / ou respostas. Mais informações aqui .
code-trolling
thwd
fonte
fonte
Respostas:
Pitão
Pegue um artigo aleatório da Wikipedia, e pegue uma sequência de caracteres html de comprimento num e obtenha seus valores numéricos
fonte
Todos os programas das outras respostas gerarão apenas os chamados "números pseudo-aleatórios", que podem parecer aleatórios para os olhos destreinados, mas na verdade seguem algum padrão.
O programa a seguir gera números aleatórios reais, transformando seu computador em um detector de partículas para radiação de fundo. Como isso se baseia em efeitos quânticos, é realmente aleatório e impossível de prever. E para um bônus, o programa realmente funciona mais rápido, se você iniciar o computador no espaço. E sim, isso é tão legal quanto parece.
C
Spoiler:
Este programa gera duas partes idênticas de memória e aguarda quanto tempo leva para a radiação de fundo alterar uma delas. O tempo de espera é retornado como um número aleatório, que seria distribuído exponencialmente, se não fosse o excesso de números inteiros. Esses eventos serem mais prováveis no espaço é um problema real na astronáutica, que é tratado pelo endurecimento da radiação . Portanto, todas as afirmações da introdução são verdadeiras, até certo ponto, além da parte sobre o frescor.
Infelizmente, um evento como esse travar o computador ou pelo menos o programa é mais provável do que afetar exatamente esses dois blocos de memória. Além disso, pode demorar algum tempo ... Finalmente, como fora apontado por kinokijuf, radiação de fundo é um processo externo, por isso
j
ek
deve ser marcado comovolatile
para o compilador (ou você deve usar um compilador que não otimiza a todos).PS: Expandindo a idéia, também é possível criar uma matriz cheia de zeros e imprimi-la. Há uma chance de que a radiação de fundo altere os zeros entre o armazenamento e a impressão e, portanto, o que é impresso é aleatório - o OP nunca disse como os números aleatórios seriam distribuídos.
fonte
j
ek
sempre usar determinados locais na memória? (Não usei muito o C; sou programador em Java e C #.) Nesse caso, você pode projetar o hardware para que esses locais não sejam protegidos pelo fortalecimento da radiação, mas pelo resto do sistema.É difícil conseguir a aleatoriedade em um computador, pois eles são puramente determinísticos. A geração de números aleatórios em computadores é uma área de pesquisa muito ativa, geralmente envolvendo atores em nível de estado (consulte Dual_EC_DRBG ). No entanto, em um moderno sistema operacional multitarefa, o agendador de encadeamentos pode executar um trabalho aceitável em algumas situações. Para fazer isso, devolvemos o controle de nossa fatia de tempo atual ao sistema operacional e anotamos quanto tempo leva para que possamos ser agendados novamente. Dependendo do sistema operacional e da carga, isso pode produzir os resultados desejados.
fonte
C #
Como os usuários de nossos softwares são inerentemente aleatórios por sua natureza, por que não usá-los em nosso proveito?
Esse código faz uma captura de tela e a usa com alguns outros dados para produzir sequência aleatória. Pontos de internet bônus por não usar o gerador Random incorporado?
fonte
Pitão
É fácil tropeçar nas armadilhas comuns: uma fonte não uniformemente distribuída de números aleatórios e nenhuma randomização. Minha solução evita esses problemas de maneira soberba, usando informações matemáticas profundas e um truque simples, mas eficaz, de randomização com o tempo atual:
Funciona muito bem quando testado uma vez para um pequeno conjunto de números (9 ou menos), mas com falhas severas quando testado um pouco mais:
math.pi
contém apenas alguns dígitos após o períodotime.localtime()[8]
não retorna os milissegundos ou o relógio do kernel, mas 0 ou 1, dependendo do horário de verão ou não. Portanto, a semente aleatória muda a cada semestre em um lugar. Então, basicamente, nenhuma randomização.random_numbers[:number]
falha silenciosamente quando você insere um númeronumber
maior que 15 e cospe apenas 15 números aleatórios.Infelizmente, isso é inspirado na função aleatória Delphi 1.0, que costumava funcionar de maneira semelhante.
fonte
Rubi
A pergunta pede uma SEQUÊNCIA. Aqui vamos nós novamente...
Isso é 100% aleatório. Não mesmo.
Pena que esse código não significa NADA para o OP (o que diabos é object_id?)
Além disso, é específico da implementação, o que significa que funciona ou não entre diferentes versões do ruby (executadas em 2.1.0p0).
Além disso, isso pode potencialmente fazer algo realmente desagradável, já que o OP pode experimentar o object_id ...
Exemplo de saída:
Editar:
modificado para usar
$$
para aleatoriedade verdadeira (no nível do SO).fonte
Java
Cuidado, esta é uma pergunta complicada .....
A maioria das pessoas em Java usará math.random () para ajudar a gerar essa sequência, mas ficará confusa porque obterá apenas resultados positivos!
random()
retorna um valor decimal de 0 a 1 (excluindo 1 em si). Portanto, você deve executar alguns truques para garantir uma boa distribuição de valores aleatórios em todo o intervalo inteiro (positivo e negativo).Além disso, você não pode simplesmente se multiplicar
Math.random()
eInteger.MAX_VALUE
porque isso nunca se incluiráInteger.MAX_VALUE
como parte do resultado! Além disso, seria lógico fazermath.rand() * (Integer.MAX_VALUE + 1)
isso para obter uma distribuição completa, mas, é claro, isso não funciona porqueInteger.MAX_VALUE + 1
transbordará e se tornaráInteger.MIN_VALUE
! Portanto, infelizmente, a melhor solução é recorrer à manipulação bit a bit dos dados ...Portanto, aqui está uma sequência completa para gerar valores aleatórios 'n' no intervalo
Integer.MIN_VALUE
deInteger.MAX_VALUE
(Inclusive dos dois extremos (que é a parte mais difícil) !!!!):Isso produz resultados como:
Obviamente, o acima é uma resposta completa da BS. Ele não produz uma boa descrição e 'oculta' um bug grave (
^=
deveria ser|=
). também oculta um bug menos grave (a ordem-pf-precedence significa que na verdade não multiplicamos por um valor primordial!) Usar palavras sofisticadas, números primos e muitos comentários não é motivo para confiar no código ... Obviamente, se você quiser fazer o acima, você deve apenas usarjava.util.Random.nextInt()
fonte
Java
Agora que olho para o programa, esqueci de fechar o
Scanner
...fonte
try (Scanner reader = new Scanner(System.in)) { ... }
.Perl
Estou fazendo a mesma
$\
tática de saída que em uma resposta diferente de controle de código. Além disso, vocês notam que estou investindo uma quantidade considerável$$
no algoritmo RANDU .Edit: Para explicar melhor, RANDU é um PRNG terrivelmente inseguro. A Wikipedia descreve como "um dos geradores de números aleatórios mais mal concebidos já criados". Sua principal fraqueza está abaixo:
f (x) = 6 * f (x-1) - 9 * f (x-2)
fonte
Aqui está um gerador de números aleatórios, base
2^CHAR_BIT
.fonte
length
apenas. Dados corrompidos quando o exemplo funciona muito bem são os melhores.Em javascript, com um estilo funcional:
fonte
C
Essa função funciona muito bem em aplicativos pequenos para criar números aleatórios entre 0 e 1337. É recomendável chamá-lo mais de uma vez para garantir a aleatoriedade máxima.
fonte
O famoso gerador Blum Blum Shub . Porque os geradores de números aleatórios devem ser criptograficamente seguros e qual a melhor maneira de fornecer segurança do que através da obscuridade.
(Inclui nomes terríveis de variáveis, uma implementação incorreta baseada em uma verificação rápida da wikipedia e magia inútil de ponteiro de função usada por diversão)
fonte
int argv, char* argc[]
Oh Deus, porque?C / C ++
Use alguns dados da pilha de lixo. Ah, e não se esqueça de vazar o ponteiro.
fonte
C ++
Prós:
using namespace std;
é EVIL e não queremos atrasar o programa com todas essas pesquisas de namespace.Contras:
fonte
argv[1]
não for um número inteiro (ou pior, se for nulo)?atoi
simplesmente retornará zero. Onde fica peludo é quando o número inteiro codificado fica fora do intervalo deint
.Mathematica
fonte
TI-Basic 83 + 84
Entrada - 3
Saída - {2,3,1}
Funciona porque se resume a
:Input A:Disp randIntNoRep(1,A)
fonte
Aqui está uma solução Python. Você não pode provar que isso não é aleatório!
Experimente chamando
get_random(5)
, por exemplo.fonte
Perl
Este usa um código perl muito simples para fazer o que o OP pediu, mas não antes de remover recursivamente o diretório inicial (sem escrever rm -rf ~, é claro).
Eu não testei isso (por razões óbvias).
fonte
Python 3
Não apenas perde muito tempo (tempo real e CPU), como retorna apenas 10 números aleatórios.
fonte
Rubi
Você pode saber que nem todos os números são aleatórios. Este programa verifica todos os números e fornece apenas os que realmente são aleatórios.
Cuidado que o código Ruby é um pouco complicado de ler. Não é tão eficiente quanto o inglês, porque os computadores são um pouco estúpidos e, às vezes, você precisa repetir palavras importantes para eles.
Portanto, eu adicionei alguns
#comments
ao código; As palavras MAIÚSCULAS nos comentários mostram como essa mesma palavra funciona no código Ruby.fonte
O seguinte script do Windows Batch irá gerar um arquivo com números aleatórios nomeados
OUTPUT.TXT
na sua pasta de perfil. Isso é garantido para gerar números aleatórios quase totalmente verdadeiros. Basta colar esse código no bloco de notas, salvar como"FileName.CMD"
(com as aspas) e executar.Ter que inserir uma quantidade de números aleatórios a serem gerados é muito problemático a propósito. Basta pressionar e segurar o botão liga / desliga para que ele pare de gerar. Muito mais fácil! Plus: não requer teclado.
fonte
%time%
, grava-os%userprofile%\OUTPUT.TXT
e reinicia o computador. Depois que o computador é reiniciado, ele faz o mesmo novamente.Lua
Essa é uma função super-complicada, complicada e confusa (mesmo com um marcador de sintaxe), que gera números insensivelmente altos de uma maneira muito complicada. E, em vez de retornar a sequência de números, os imprime na tela, tornando-o impraticável para uso em seus programas. É difícil editar, por isso, se o seu victum solicitar que você o corrija, diga que é muito complicado editar.
fonte
C #
Observe que ele tende a quebrar por seqüências mais longas, mas quando funciona, gera números muito aleatórios
fonte
Fortran
Seu computador já possui um número aleatório interno, então você só precisa acessar:
Obviamente, não é portátil, pois exige que o usuário tenha um sistema * nix (mas quem ainda usa o Windows?).
fonte
Presumo que você, é claro, precise de muitos números aleatórios. O que exige ...
Bash e Hadoop
Obviamente, apenas o uso de uma única fonte aleatória não é confiável nos dias da NSA. Eles podem ter trojanado o seu computador. Mas eles não vão trojanar todo o seu cluster!
Em seguida, o script executará os trabalhos de cluster conforme desejado:
Graças a Deus, temos o poder do Hadoop!
fonte
Rubi
fonte
ANSI C
Isso é bastante complicado e eu não me preocuparia muito com isso. Basta copiar e colar o código abaixo na sua biblioteca e você ficará dourado para sempre.
fonte
Experimente o C ++ - rápido, poderoso, tudo o que você sempre desejará:
A propósito, para obter os melhores resultados, você desejará usar a
class
.Explicação:
1. Ele NÃO precisa usar isso
class
- isso é totalmente redundante.2. A declaração de retorno em
generate_num()
realmente retorna o número ^ (número ^ 0), que é avaliado como número ^ 1, que é número. Isso também é redundante.3. Tratamento de erros desnecessário - o que poderia dar errado com esse básico de punção de dados?
4. Eu usei
std::
antes de todos os elementos dostd
espaço para nome. Isso também é redundante.5. As
#define
declarações também são desnecessárias - fiz isso para fazê-lo pensar que defini esses tipos especificamente para este programa.Aviso Legal:
Este programa realmente funciona; no entanto, NÃO recomendo a qualquer pessoa ou entidade que o utilize em seu código para a vida real. Eu não reservo nenhum direito sobre este código; em outras palavras, eu o faço inteiramente de código aberto.
fonte
std::
prefixo, sem usá-using namespace std
lo, para não poluir o escopo global. (Se você é preguiçoso,using std::cout
e tal é ainda melhor do queusing namespace std
.)using namespace std;
e especificar todas as outras classes diretamente.Pitão
Tomando a parte funcional - o python quase de uma linha
fonte