Rolador de Dados Online É Realmente Aleatório?
Quem já viu um d20 virtual entregar três 1 seguidos desconfiou da honestidade da coisa. É uma dúvida legítima e, diferente da maioria das discussões de mesa, tem resposta verificável. Dados digitais podem ser genuinamente justos, podem ser injustos de um jeito que ninguém percebe, e são — com algum cuidado — mais justos que o plástico da sua bolsinha.
Os dois geradores aleatórios do navegador
Todo navegador tem dois, e eles não são intercambiáveis.
Math.random() é rápido e existe desde sempre. Ele produz números que parecem aleatórios e passam nos testes estatísticos comuns, mas são gerados por um algoritmo determinístico a partir de um estado interno. Ele foi feito para animações e embaralhamento visual, não para nada em que a previsibilidade importe. Em navegadores modernos ele costuma usar o algoritmo xorshift128+, cuja saída, com amostras suficientes, permite reconstruir o estado interno.
crypto.getRandomValues() puxa do gerador criptográfico do sistema operacional — a mesma fonte usada para gerar chaves de criptografia. É mais lento em termos absolutos e completamente irrelevante nessa escala: você rola dezenas de dados por sessão, não milhões.
Para uma rolagem de dado, a escolha honesta é a segunda. É a que este site usa, em todas as rolagens, inclusive na bola mágica 8.
Viés de módulo: o erro que ninguém vê
Aqui está o problema mais comum, e ele é sutil o bastante para sobreviver em código de produção por anos.
Você tem um número aleatório de 0 a 4.294.967.295 (um inteiro de 32 bits) e quer um resultado de 1 a 100. A solução óbvia é o resto da divisão:
// ERRADO
const resultado = (numeroAleatorio % 100) + 1;
O problema é que 4.294.967.296 não é divisível por 100. Os primeiros 96 valores da faixa recebem uma combinação a mais que os outros, então os números baixos saem com mais frequência. O desvio é pequeno — na ordem de 0,000002% para um d100 — mas ele é real, é sistemático, e ele cresce conforme o dado fica maior.
A correção se chama amostragem por rejeição: descarte os valores que caem na sobra e sorteie de novo.
// CERTO
const limite = 4294967296 - (4294967296 % 100);
let valor;
do {
valor = sortear32Bits();
} while (valor >= limite);
const resultado = (valor % 100) + 1;
O laço quase nunca roda mais de uma vez, e o resultado é exatamente uniforme em vez de aproximadamente uniforme. É o que a função de rolagem deste site faz, e é a única razão pela qual ela tem um do/while em vez de uma linha só.
O dado de plástico não é o padrão-ouro
A parte que surpreende: um dado físico comum é bem menos justo do que as pessoas supõem.
Um d20 injetado em molde tem os pontos escavados — o que remove material de forma desigual —, uma linha de rebarba onde as duas metades do molde se encontram, cantos arredondados em graus diferentes conforme o desgaste, e um centro de massa que raramente coincide com o centro geométrico. Testes com dados de RPG comuns já mostraram desvios de vários pontos percentuais em faces específicas.
Dados de cassino são construídos de forma diferente por causa disso: cantos vivos, pontos preenchidos com material da mesma densidade, tolerâncias na casa dos milésimos de polegada, e uma vida útil curta antes de serem aposentados. É por isso que eles custam o que custam.
Um gerador criptográfico com amostragem por rejeição não tem desgaste, não tem molde e não tem centro de massa. Ele é uniforme por construção.
O que verificar num rolador online
Nem todo rolador é honesto, e a maioria não conta o que faz. Vale procurar:
- A fonte aleatória é declarada. Se a página não diz de onde vem o número, ela provavelmente usa
Math.random(). - A animação não decide nada. O número tem de ser sorteado primeiro e a animação instruída a parar naquela face. Se a física do navegador decide onde o dado para, a fonte de aleatoriedade virou o motor gráfico — e ele não foi feito para isso.
- O código é verificável. Um rolador que explica o método e mostra a função é falsificável; um que só afirma ser justo não é.
- Os dados individuais aparecem. Se
4d6kh3mostra só o total, você está confiando na conta em vez de conferir.
E as sequências estranhas?
Três 1 seguidos num d20 têm chance de 1 em 8.000. Numa campanha longa, com uma mesa inteira rolando, isso acontece — e você vai lembrar, porque a memória guarda o notável e descarta o comum.
Um gerador que evitasse repetições seria menos aleatório, não mais. Aleatoriedade de verdade tem grumos; a distribuição perfeitamente espaçada que as pessoas esperam é justamente o que um gerador viciado produziria.
Se você quiser conferir por conta própria, role algumas centenas de vezes e conte. Com 200 rolagens de d20 você deve ver cada face umas 10 vezes, com variação considerável — e é a variação que prova que está funcionando.