Gerador de números aleatórios
Resultado
Números sorteados
- Valores possíveis
- 100
- Chance de pelo menos um número repetido
- 9,65%
Um gerador de números aleatórios transforma um ponto de partida numa lista de números inteiros dentro de um intervalo que você define. Este aqui recebe um intervalo, quantos números você quer e a semente aleatória de onde começar, e devolve exatamente essa quantidade de inteiros — os mesmos toda vez que você usar a mesma semente, que é o que faz de uma lista algo que você pode entregar a outra pessoa e ela reproduzir. Desligue as repetições e o resultado passa a ser uma seleção em vez de uma sequência, de modo que nenhum valor pode sair duas vezes; deixe as repetições permitidas e os números são sorteios independentes, que é o modelo honesto para um dado, um globo de loteria ou uma lista embaralhada que pode repetir. O painel informa ainda quantos valores diferentes o intervalo tem e qual seria a chance de repetição se as repetições fossem permitidas.
Fórmula
próximo = (state + 0x6D2B79F5) misturado por multiplicação e deslocamento → valor = minimum + ⌊próximo × (maximum − minimum + 1)⌋
- seed
- O estado inicial do gerador, qualquer número inteiro de 0 a 4.294.967.295. Ele não é uma fonte de aleatoriedade por si só — é o ponto em que a sequência começa, e é exatamente por isso que a mesma semente dá sempre a mesma lista
- state
- O estado corrente, atualizado uma vez por número. A atualização mistura o estado com uma constante fixa e alguns passos de multiplicação e deslocamento; a mistura é o que faz valores consecutivos parecerem sem relação entre si, e é o passo que quebraria primeiro se fosse simplificado
- minimum, maximum
- Os extremos do intervalo, ambos incluídos. A largura do intervalo é aquilo pelo que a fração é escalada, então todo número inteiro dentro dele tem a mesma chance
- ⌊ ⌋
- Arredondar para baixo. O gerador produz uma fração em [0, 1) e a função piso a transforma em um dos números inteiros do intervalo
- count
- Quantos números produzir, até 200. Com as repetições desligadas ele não pode passar da largura do intervalo, porque uma seleção não pode ser mais longa do que o conjunto de onde ela vem
Use quando você precisar de uma lista em vez de um número só: uma amostra para conferir à mão, um conjunto de casos de teste que precisa ser o mesmo em toda execução, um sorteio que você quer poder refazer na frente de uma plateia, ou dados de exemplo. A possibilidade de fixar a semente é o motivo de preferir isto à função aleatória que a sua linguagem traz — uma semente transforma um resultado avulso em algo que você pode compartilhar, conferir de novo e discutir. Recorra a ele com as repetições desligadas quando o mesmo item não puder aparecer duas vezes, que é o formato de um sorteio de loteria, de uma amostra aleatória de uma lista e de uma ordem embaralhada. Duas coisas para as quais ele não serve: não é uma fonte de números imprevisíveis, então nada que precise ser indecifrável pertence aqui; e não substitui uma amostra aleatória estatística de uma população real, porque ele não sabe nada sobre a população, só sobre o intervalo.
Exemplos resolvidos
Cinco números de 1 a 100, e os mesmos cinco de novo
- O intervalo de 1 a 100 contém 100 valores diferentes, então cada sorteio é um entre 100
- A semente 1 fixa o estado inicial; cada um dos cinco números o atualiza uma vez
- Arredondando cada fração para baixo dentro de 1 a 100 chega-se a 63, 1, 53, 99 e 97 nessa ordem
Esses cinco números não são coincidência nem uma tabela guardada: são o que a semente 1 produz, e digitar 1 de novo no campo da semente os reproduz exatamente. Repare que os 9,65% são uma afirmação sobre o intervalo e a quantidade, e não sobre este sorteio em particular — com cinco sorteios entre cem valores existe um pouco menos de uma chance em dez de que dois deles coincidam, independentemente de quaisquer dois desta lista coincidirem ou não. Mudar a semente para 7 dá uma lista completamente diferente e deixa essa porcentagem intacta, que é o jeito mais limpo de ver qual parte do painel é aleatória e qual parte é aritmética.
Seis números de 1 a 49 com repetições proibidas
- O conjunto tem 49 valores e seis deles são sorteados sem reposição
- Cada novo número é sorteado de novo até ser um que o conjunto ainda não entregou, e é por isso que um valor nunca pode aparecer duas vezes
- Lendo a lista na ordem em que foi produzida chega-se a 23, 16, 33, 31, 8 e 11
Desligar as repetições não muda os 27,26%, e é esse o sentido de informá-los ao lado deste exemplo: é a chance de que seis sorteios entre 49 teriam colidido se as repetições fossem permitidas, e ela é a mesma quer você as tenha proibido ou não. É também o que torna um sorteio sem repetição caro em contagens grandes — com 49 valores e 6 sorteios, mais de um quarto dos sorteios irrestritos repetiria alguma coisa, e em 23 sorteios entre 365 o número passa da metade. Os números ficam na ordem em que foram sorteados em vez de ordenados, para que a mesma semente e os mesmos ajustes sempre reproduzam a mesma lista.
Um intervalo com um único valor dentro
- O intervalo contém exatamente um valor, então todo sorteio é esse valor
- A chance de repetição é a chance de quatro sorteios colidirem, e com um conjunto de um eles precisam colidir
- O resultado é 7, 7, 7 e 7
Este é o limite em que o gerador deixa de ser aleatório e vira uma constante, e vale ter isso em mente porque é o único caso em que a saída é totalmente previsível antes de você apertar qualquer coisa. Ele marca também a fronteira do modo sem repetição: com o mesmo intervalo, pedir dois números sem repetição é um pedido impossível, e não uma lista curta, e a página diz isso em vez de devolver um número em silêncio.
Limitações
Estes números não servem para nada que precise ser indecifrável. O gerador é uma pequena sequência aritmética semeada, rápida, do tipo que vem embutido em software comum: dada a semente, qualquer pessoa reproduz a lista inteira e, dados alguns valores dela, o resto pode ser descoberto. Isso o desqualifica para senhas, chaves, tokens, códigos de uso único, loterias com dinheiro envolvido e qualquer outra coisa em que um participante não possa prever nem reconstruir o sorteio. Para esses casos, uma fonte aleatória criptográfica é a única resposta correta. A chance de repetição também não é uma afirmação sobre a lista que você está olhando: é a probabilidade de que um sorteio daquele tamanho, tirado daquele conjunto, contenha ao menos uma colisão, calculada como se os sorteios fossem independentes e uniformes, e ela é informada quer as repetições tenham sido permitidas ou não. O sentido prático dela é o que pega as pessoas — uma colisão só precisa de mais ou menos a raiz quadrada do tamanho do conjunto para se tornar provável, então 23 sorteios entre 365 datas já passam da chance de um em dois. E a contagem é limitada a 200 por execução, com o modo sem repetição impossível assim que a contagem passa do tamanho do conjunto.
Perguntas frequentes
- Estes números são seguros para usar numa loteria, numa senha ou num token de segurança?
- Não. Este gerador é uma pequena sequência aritmética semeada, do tipo que o software comum usa, e não um gerador criptográfico: a partir da semente, a lista inteira pode ser reproduzida e, a partir de alguns dos seus valores, o resto pode ser descoberto. Qualquer coisa em que um participante não possa prever nem reconstruir o resultado — loterias com dinheiro envolvido, senhas, chaves, tokens, códigos de uso único — precisa de uma fonte aleatória criptográfica. Para sorteios, amostras, jogos e dados de teste, em que a reprodutibilidade é uma qualidade e não um vazamento, ele é a ferramenta certa.
- Para que serve a semente, e por que recebo os mesmos números toda vez?
- A semente é o estado de onde a sequência parte, então a mesma semente sempre produz a mesma lista. Isso é deliberado: torna o resultado reprodutível, que é o que você quer quando precisa entregar uma amostra a outra pessoa, refazer um sorteio na frente de uma plateia ou impedir que um caso de teste se desloque. Mude a semente e você recebe uma lista diferente com os mesmos ajustes. Se você quer que os números sejam diferentes a cada vez, mude a semente entre uma execução e outra — o valor que você digita fica registrado junto com o resultado, então uma lista de que você gostou sempre pode ser recuperada.
- Por que repetições ainda podem aparecer quando elas são permitidas?
- Porque cada sorteio é independente. Com as repetições permitidas, cada posição escolhe um dos valores do intervalo sem levar em conta o que as outras posições escolheram, que é o modelo honesto para um dado ou para um globo de loteria que devolve a bola. A chance de repetição no painel é exatamente a probabilidade de que ao menos um par colida — cerca de 9,65% para cinco sorteios entre cem valores, e mais de 50% quando você sorteia 23 valores entre 365. Desligue as repetições quando o mesmo valor não puder aparecer duas vezes, que é o formato de um sorteio, de uma amostra de uma lista ou de uma ordem embaralhada.
- A chance de repetição diminui se eu proibir as repetições?
- Não, e o painel continua mostrando o mesmo número de propósito. Ele responde à pergunta que você de fato está fazendo quando aciona esse ajuste: quão provável uma colisão teria sido se as repetições fossem permitidas. Para seis números de 1 a 49 isso é 27,26%, então proibir as repetições remove um risco real, e não teórico. É também o que explica por que um sorteio sem repetição fica lento e acaba impossível em contagens grandes — assim que a contagem passa do número de valores do intervalo não existe resposta válida nenhuma, e a página informa isso em vez de devolver uma lista mais curta.
- Quantos números posso gerar de uma vez e em que intervalo?
- Até 200 números por execução, e os extremos do intervalo precisam ser números inteiros, com o mínimo não maior que o máximo. Os valores em si podem ser negativos, então um intervalo de −50 a 50 é válido. Extremos não inteiros são recusados em vez de arredondados: com as repetições proibidas, sortear de um intervalo que contém frações tornaria a regra de não repetir uma condição vazia, e uma lista que parece plausível enquanto ignora em silêncio o próprio ajuste é pior do que uma mensagem de erro.
- Os números estão ordenados?
- Não — eles são impressos na ordem em que foram sorteados, e essa ordem faz parte do resultado. Ordenar jogaria fora a informação que a mesma semente deve reproduzir, e isso importa em qualquer coisa em que a posição tenha significado, como distribuir uma ordem embaralhada ou dar uma mão de cartas. Se você quer uma seleção ordenada, ordene a lista por conta própria depois de copiá-la; o sorteio em si continua fiel à sequência que a semente produziu.
Referências
- SP 800-90A Rev. 1, Recommendation for Random Number Generation Using Deterministic Random Bit Generators — National Institute of Standards and Technology (NIST), Computer Security Resource Center
- Math.random() — JavaScript reference (a built-in generator with no seed parameter, and the explicit warning that it is not cryptographically secure) — MDN Web Docs, Mozilla
- Birthday Problem — from Wolfram MathWorld (the probability that a group drawn from a pool contains a repeated value, 1 − the falling-factorial product over the pool size) — Wolfram MathWorld