O que separa um sorteador confiável de um sorteador qualquer
Sortear números parece trivial, mas a maioria das implementações comete pelo menos um dos dois erros abaixo. Vale saber identificá-los, principalmente se o sorteio envolver dinheiro ou disputa entre pessoas.
Erro 1: usar o gerador pseudoaleatório comum
A função Math.random() foi projetada para simulações leves, não para
imprevisibilidade. Ela parte de uma semente interna e produz uma sequência determinística. Para
escolher a cor de uma animação, serve bem. Para decidir quem leva um prêmio, é fraca.
Nosso sorteador usa crypto.getRandomValues(), que busca entropia do sistema
operacional, combinando fontes físicas como variações de temporização de hardware.
Erro 2: ignorar o viés de módulo
Este é sutil e quase universal. Ao pegar um número aleatório muito grande e aplicar o resto da divisão pela quantidade desejada, os primeiros valores do intervalo saem com frequência ligeiramente maior, porque o intervalo total não divide de forma exata.
A distorção é pequena, mas existe e é evitável. Aplicamos amostragem por rejeição: quando o valor sorteado cai na faixa que causaria o desequilíbrio, ele é descartado e um novo é gerado. O resultado é uma distribuição genuinamente uniforme.