BrowserTools
Publicidade
Início / Diversos / Seletor Aleatório: Lista, Moeda, Dados, Número

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?
Não. Tudo o que introduzes na ferramenta e todos os resultados que ela produz existem unicamente no separador do teu navegador. Nenhum dado é transmitido pela rede, nenhuma lista é guardada em qualquer base de dados e nenhum resultado é registado. Fechar o separador descarta tudo de forma permanente.
Qual é a diferença entre Math.random() e crypto.getRandomValues()?
`Math.random()` usa um gerador de números pseudoaleatórios, normalmente xorshift128+ nos motores modernos, que é rápido mas é semeado de forma determinista e não foi concebido para ser imprevisível. `crypto.getRandomValues()` retira do reservatório de entropia do sistema operativo, alimentado por fontes de ruído por hardware, e foi concebido para que seja computacionalmente inviável prevê-lo. Esta ferramenta usa `crypto.getRandomValues()` para todas as seleções aleatórias.
Como funciona o lançamento de moeda? É mesmo 50/50?
Sim. O lançamento de moeda gera um único bit criptograficamente aleatório: um inteiro aleatório de 32 bits de `crypto.getRandomValues`, e depois verifica se é par ou ímpar. Cada lançamento é totalmente independente de todos os anteriores, e a probabilidade de cara ou coroa é exatamente de 50% em cada lançamento, tal como uma moeda física que não tem memória.
Posso usar isto para uma rifa ou competição justa?
Sim, e é um dos melhores casos de utilização. Introduz todos os nomes dos participantes ou os números dos bilhetes na lista, um por linha, e escolhe um (ou vários sem reposição). Como o gerador subjacente é criptograficamente seguro e corre no teu navegador, não há nenhum operador que possa influenciar o resultado. Para sorteios de grande importância, considera gravar o ecrã com a consola do navegador a mostrar os valores aleatórios em bruto, para teres um registo de auditoria.
Posso escolher vários itens de uma lista sem repetir o mesmo item?
Sim. No modo de lista, define a contagem "Escolher N" para o número de itens de que precisas e ativa a opção "Sem repetições". A ferramenta efetua um baralhamento de Fisher-Yates, que produz uma permutação uniformemente aleatória, e devolve os primeiros N itens da lista baralhada. Cada item surge no máximo uma vez no resultado.
Como funciona o lançamento de dados com vários tipos de dados?
Para cada dado, a ferramenta gera um inteiro criptograficamente aleatório no intervalo de 1 ao número de faces do dado (1d6 dá 1–6, 1d20 dá 1–20, e assim por diante). Vários dados são lançados de forma independente e os seus valores são somados quando aplicável. Podes combinar diferentes tipos de dados, como 2d6 + 1d8, para replicar a mecânica de sistemas específicos de jogos de role-playing de mesa.
Esta ferramenta é adequada para gerar números aleatórios para fins criptográficos?
Os valores aleatórios são gerados com `crypto.getRandomValues`, que é criptograficamente seguro. No entanto, esta ferramenta foi concebida para a seleção aleatória virada para o utilizador e não produz entropia em bruto nem arrays de bytes. Para gerar chaves criptográficas, nonces ou tokens, usa uma biblioteca ou ferramenta de geração de chaves dedicada em vez de ler os números apresentados aqui.
O que é um baralhamento de Fisher-Yates e porque é que importa?
O algoritmo de Fisher-Yates (também chamado baralhamento de Knuth) é o método padrão para produzir uma permutação uniformemente aleatória de uma lista. Itera do último elemento para o primeiro, trocando cada elemento por um escolhido ao acaso na sua posição atual ou antes dela. Todas as ordenações possíveis da lista são igualmente prováveis. Os algoritmos de baralhamento ingénuos, como ordenar por chaves aleatórias, produzem distribuições enviesadas em que algumas ordenações são mais prováveis do que outras.
Posso escolher um item ao acaso com itens que tenham probabilidades diferentes?
Esta ferramenta trata todos os itens da lista como igualmente prováveis. Para simular probabilidades ponderadas, acrescenta os itens à lista várias vezes em proporção ao peso pretendido; por exemplo, se o item A deve ser duas vezes mais provável do que o item B, põe A duas vezes e B uma vez. Isto equivale a um sistema de bilhetes de lotaria ponderado e não requer qualquer funcionalidade especial da ferramenta.
O que acontece se duas pessoas executarem esta ferramenta ao mesmo tempo? Poderiam obter o mesmo resultado?
Sim, teoricamente. Cada instância do navegador gera a sua própria sequência aleatória independente, sem coordenação entre utilizadores. Duas pessoas que executem a ferramenta em simultâneo poderiam obter o mesmo resultado por coincidência, com a mesma probabilidade que qualquer outro desfecho coincidente. Para sorteios em que é necessária a unicidade entre vários utilizadores simultâneos, como atribuir IDs aleatórios sem sobreposição, é necessária, em vez disso, uma abordagem coordenada pelo servidor.

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.

Publicidade
Publicidade
Publicidade