Como gerar números aleatórios em Ruby

Embora nenhum computador possa gerar números verdadeiramente aleatórios, Ruby fornece acesso a um método que retornará pseudo-aleatório números.

Nenhum computador pode gerar verdadeiramente Números aleatórios puramente por computação. O melhor que eles podem fazer é gerar pseudo-aleatório números, que são uma sequência de números que aparecer aleatório, mas não é.

Para um observador humano, esses números são realmente aleatórios. Não haverá sequências curtas de repetição e, pelo menos para o observador humano, elas não apresentarão um padrão claro. No entanto, com tempo e motivação suficientes, o original semente pode ser descoberto, a sequência recriada e o próximo número na sequência adivinhado.

Por esse motivo, os métodos discutidos neste artigo provavelmente não devem ser usados ​​para gerar números que devem ser criptograficamente seguros.

Os geradores de números pseudo-aleatórios devem ser semeado para produzir seqüências que diferem cada vez que um novo número aleatório é gerado. Nenhum método é mágico - esses números aparentemente aleatórios são gerados usando algoritmos relativamente simples e aritmética relativamente simples. Semeando o PRNG, você o inicia em um ponto diferente a cada vez. Se você não o propinasse, ele geraria a mesma sequência de números a cada vez.

instagram viewer

Em Ruby, o Kernel # srand O método pode ser chamado sem argumentos. Ele escolherá uma semente de número aleatório com base no tempo, no ID do processo e no número de sequência. Simplesmente ligando srand em qualquer lugar do início do seu programa, ele gerará uma série diferente de números aparentemente aleatórios toda vez que você o executar. Esse método é chamado implicitamente quando o programa é iniciado e semeia o PRNG com o tempo e o ID do processo (sem número de sequência).

Depois que o programa estiver sendo executado e Kernel # srand foi implicitamente ou explicitamente chamado, o Kernel # rand método pode ser chamado. Esse método, chamado sem argumentos, retornará um número aleatório de 0 a 1. No passado, esse número era tipicamente escalado para o número máximo que você gostaria de gerar e talvez to_i pediu para convertê-lo em um número inteiro.

No entanto, o Ruby facilita um pouco as coisas se você estiver usando o Ruby 1.9.x. o Kernel # rand O método pode receber um único argumento. Se este argumento é um Numérico de qualquer tipo, Ruby irá gerar um número inteiro de 0 até (e não incluindo) esse número.

No entanto, e se você deseja gerar um número de 10 a 15? Normalmente, você gera um número de 0 a 5 e o adiciona a 10. No entanto, Ruby facilita.

Certifique-se de prestar atenção aos dois tipos de intervalos. Se você ligou margem (10..15), isso geraria um número de 10 a 15 Incluindo 15. Enquanto que rand (10... 15) (com 3 pontos) geraria um número de 10 a 15 não incluindo 15.

Às vezes, você precisa de uma sequência de números com aparência aleatória, mas precisa gerar a mesma sequência sempre. Por exemplo, se você gerar números aleatórios em um teste de unidade, sempre deverá gerar a mesma sequência de números.

Um teste de unidade que falhar em uma sequência deve falhar novamente na próxima vez em que for executado; se gerar uma sequência de diferenças na próxima vez, poderá não falhar. Para fazer isso, ligue Kernel # srand com um valor conhecido e constante.

A implementação de Kernel # rand é bastante anti-Ruby. Ele não abstrai o PRNG de forma alguma, nem permite instanciar o PRNG. Há um estado global para o PRNG que todo o código compartilha. Se você alterar a semente ou alterar o estado do PRNG, poderá ter uma gama de efeitos mais ampla do que o previsto.

No entanto, como os programas esperam que o resultado desse método seja aleatório - esse é o seu objetivo! - isso provavelmente nunca será um problema. Somente se o programa espera ver uma sequência esperada de números, como se tivesse chamado srand com um valor constante, caso ocorra resultados inesperados.

instagram story viewer