Seletor Aleatório: Lista, Moeda, Dados, Número
Escolhe um item ao acaso de uma lista, lança uma moeda, lança dados ou gera um número aleatório.
A carregar Seletor Aleatório: Lista, Moeda, Dados, Número… Se nada acontecer, ativa o JavaScript.
A verdadeira aleatoriedade é surpreendentemente difícil de obter com um computador. Os computadores são máquinas deterministas: dado o mesmo estado inicial, produzem a mesma saída. Os primeiros geradores de números aleatórios para jogos e simulações usavam fórmulas matemáticas, normalmente geradores congruenciais lineares, que produzem sequências que parecem aleatórias mas que são totalmente previsíveis se conheceres o valor da semente e o algoritmo. Esta distinção entre a aleatoriedade verdadeira e a pseudoaleatoriedade importa enormemente em contextos como a criptografia, onde uma sequência previsível pode ser explorada, mas também em sorteios justos, rifas e jogos onde a imprevisibilidade verificável faz parte do contrato social.
Perguntas frequentes
As minhas listas ou resultados são armazenados ou enviados para um servidor?
Qual é a diferença entre Math.random() e crypto.getRandomValues()?
Como funciona o lançamento de moeda? É mesmo 50/50?
Posso usar isto para uma rifa ou competição justa?
Posso escolher vários itens de uma lista sem repetir o mesmo item?
Como funciona o lançamento de dados com vários tipos de dados?
Esta ferramenta é adequada para gerar números aleatórios para fins criptográficos?
O que é um baralhamento de Fisher-Yates e porque é que importa?
Posso escolher um item ao acaso com itens que tenham probabilidades diferentes?
O que acontece se duas pessoas executarem esta ferramenta ao mesmo tempo? Poderiam obter o mesmo resultado?
Sobre Seletor Aleatório: Lista, Moeda, Dados, Número
A necessidade de escolher ao acaso surge constantemente na vida quotidiana e em contextos técnicos. Os professores usam seletores aleatórios para questionar os alunos sem mostrar favoritismos. Os organizadores de rifas escolhem vencedores de prémios a partir de longas listas de participantes. Os mestres de jogo lançam dados para resolver os desfechos dos jogos de role-playing de mesa. Os programadores precisam de atribuir utilizadores de teste ao acaso às coortes de uma experiência A/B, baralhar arrays de dados ou gerar conjuntos de dados de amostra aleatórios. Os decisores usam lançamentos de moeda e geradores de números aleatórios para desempatar ou introduzir uma variabilidade deliberada em processos que de outra forma poderiam desenvolver enviesamentos sistemáticos. As ligas desportivas usam sorteios aleatórios para atribuir chaves e jogos.
Esta ferramenta usa `crypto.getRandomValues`, o mesmo gerador de números pseudoaleatórios criptograficamente seguro (CSPRNG) que os navegadores usam para o material de chaves de TLS e a geração de palavras-passe. Ao contrário de `Math.random()`, que usa um algoritmo sem semente que pode ser previsto a partir da saída observada e que explicitamente não é adequado para fins de segurança, `crypto.getRandomValues` retira a sua entropia das fontes de ruído por hardware do sistema operativo: a temporização de interrupções, o ruído térmico e outros fenómenos físicos imprevisíveis. Isto significa que cada escolha é independente de todas as escolhas anteriores e não pode ser prevista nem revertida. Tudo corre no navegador, não intervém qualquer servidor, e não é armazenada qualquer lista ou resultado.
Algumas notas práticas: ao escolher vários itens de uma lista sem reposição (cada item só pode ser escolhido uma vez), a ferramenta efetua um baralhamento de Fisher-Yates da lista e devolve os primeiros N itens. Isto é matematicamente equivalente a pôr nomes num chapéu e ir tirando-os um a um. Para os lançamentos de dados, podes combinar vários tipos de dados, 1d6 + 1d20 + 2d8, para replicar a mecânica dos jogos de role-playing de mesa. Para os intervalos numéricos, os extremos são inclusivos de ambos os lados. Se quiseres um sorteio aleatório ponderado, onde alguns itens são mais prováveis do que outros, duplica esses itens na tua lista de forma proporcional antes de executar o seletor.
De lançar ossos ao ruído quântico: cinco milénios a tentar gerar aleatoriedade
Os humanos procuram uma aleatoriedade fiável desde que precisaram de tomar decisões justas, repartir heranças ou consultar o divino. Os dispositivos de aleatoriedade mais antigos que se conhecem são os astrágalos (ossinhos do jogo), os ossos do tornozelo das ovelhas, usados como dados na Mesopotâmia e no Egito já por volta de 3000 a.C. A prática romana de deitar sortes (sortes) usava seixos, fragmentos de cerâmica ou fichas de madeira retirados de um recipiente. Diz-se que Júlio César resolvia disputas por sorteio, e a própria palavra "lotaria" deriva do francês antigo "lot", que significa destino ou porção.
O primeiro gerador de números aleatórios algorítmico foi publicado por John von Neumann em 1946 como o método dos quadrados médios: pegas num número, elevas ao quadrado, extrais os dígitos do meio e repetes. O próprio Von Neumann não se iludia; observou que qualquer pessoa que use métodos aritméticos para produzir números aleatórios está em estado de pecado. O método era determinista e tornava-se periódico rapidamente, repetindo a sua sequência ao fim de algumas centenas de iterações. Os geradores congruenciais lineares (LCG), introduzidos formalmente por D. H. Lehmer nesse mesmo ano, eram mais robustos e mantiveram-se como o padrão em linguagens como o `rand()` do C durante décadas.
O reconhecimento de que a pseudoaleatoriedade determinista é fundamentalmente inadequada para a criptografia impulsionou o desenvolvimento de geradores de números aleatórios por hardware (HRNG) e, mais tarde, dos reservatórios de entropia ao nível do sistema operativo que sustentam hoje `crypto.getRandomValues()`. O `/dev/random` e o `/dev/urandom` do Linux, introduzidos em meados da década de 1990, recolhem entropia da temporização do teclado, dos tempos de busca do disco e das interrupções de rede. Os CPU modernos incluem instruções de hardware dedicadas, o RDRAND da Intel e o equivalente da AMD, que medem o ruído térmico nos transístores para produzir bits verdadeiramente aleatórios a velocidades de gigabit. Aquilo que von Neumann descreveu como pecado foi substituído pela física quântica.