aleatório | com semente | reproduzível

> gerador de números aleatórios <

// Gere inteiros e decimais criptograficamente aleatórios — ou use uma semente para execuções reproduzíveis

[CRYPTO]

Aleatoriedade Criptográfica

Usa por padrão crypto.getRandomValues() com amostragem por rejeição, de modo que cada inteiro no seu intervalo tenha igual probabilidade — sem viés de módulo.

[SEEDED]

Modo Reproduzível com Semente

Forneça qualquer cadeia de semente para alternar para um PRNG mulberry32 determinístico. Mesma semente, mesmos números — perfeito para testes e simulações.

[NO-DUP]

Modo Sem Duplicatas

Gere inteiros únicos via amostragem no estilo Fisher-Yates. Ótimo para sorteios de loteria, rifas ou amostragem sem reposição.

[DECIMALS]

Controle de Precisão Decimal

Mude para o modo decimal e escolha de 1 a 10 casas. Os números são distribuídos uniformemente em [mín, máx) e arredondados para a precisão escolhida.

// SOBRE A GERAÇÃO DE NÚMEROS ALEATÓRIOS

Como Funciona:

Quando o campo de semente está vazio, esta ferramenta chama crypto.getRandomValues(new Uint32Array(1)), um CSPRNG (PRNG criptograficamente seguro) alimentado pelo pool de entropia do seu sistema operacional. Para mapear um inteiro sem sinal de 32 bits em um intervalo arbitrário [min, max] sem viés de módulo, o gerador usa amostragem por rejeição: qualquer sorteio acima do maior múltiplo do intervalo que cabe em 2^32 é descartado e re-sorteado. Quando você fornece uma semente, a cadeia é convertida em hash com cyrb53 para um inteiro de 32 bits e alimentada ao mulberry32, um PRNG rápido de 32 bits com período de 2^32 — determinístico e reproduzível. O modo decimal escala uma amostra uniforme [0,1) para [min, max) e então formata com toFixed(places).

Exemplo:

min=1, max=100, count=5, seed="hello" -> 39, 98, 64, 12, 71 (sempre)

Normas e Referências:

  • >Web Crypto API (W3C) — contrato crypto.getRandomValues() para CSPRNGs
  • >RFC 4086 — Randomness Requirements for Security
  • >mulberry32 — PRNG de 32 bits de Tommy Ettinger, domínio público
  • >cyrb53 — hash de cadeia rápido de 53 bits para semeadura (bryc, domínio público)

Casos de Uso Comuns:

  • >Sorteios de loteria e rifas com seleções comprovadamente únicas
  • >Amostragem aleatória sem reposição para pesquisas e auditorias
  • >Simulações de Monte Carlo e experimentos estatísticos
  • >Distribuição de testes A/B com atribuições reproduzíveis por semente
  • >Mecânicas de jogo: substitutos de dados, tabelas de loot, sementes de fase
  • >Dados de teste de QA e geração de entradas de fuzzing
  • >Escolha de vencedores, juízes ou primeiros apresentadores em reuniões
  • >Geração de dados sintéticos para protótipos e demonstrações

Ferramentas Relacionadas:

  • >Gerador de UUID — identificadores v4 aleatórios quando você precisa de um ID único em vez de um número
  • >Gerador de Senhas — cadeias criptograficamente aleatórias com controle do conjunto de caracteres
  • >Gerador BIP39 — frases mnemônicas de semente aleatórias para carteiras de criptomoedas
  • >randompickerwheel.app — interface de roleta giratória quando você quer um selecionador aleatório visual para um público ao vivo ou uma sala de aula

// EXEMPLOS DE SAÍDA

Sorteio de loteria — 6 números únicos de 1 a 49

config: min=1, max=49, count=6, no-duplicates=on, sort=ascending

output:

7, 13, 22, 28, 35, 41

Substituto de dados — dez rolagens de d20 (duplicatas permitidas)

config: min=1, max=20, count=10, no-duplicates=off, sort=none

output:

14, 3, 20, 11, 7, 14, 2, 19, 8, 11

Amostragem decimal — 5 valores em ponto flutuante em [0, 1) com 4 casas decimais

config: type=decimal, min=0, max=1, count=5, places=4

output:

0.4172, 0.8635, 0.0291, 0.5508, 0.7723

Reproduzível com semente — a mesma semente gera a mesma sequência

config: min=1, max=100, count=5, seed="hello" (executar duas vezes)

output:

Execução 1: 39, 98, 64, 12, 71 / Execução 2: 39, 98, 64, 12, 71

Distribuição — 100 seleções A/B ponderadas via módulo inteiro

config: min=0, max=99, count=100, seed="experiment-42", sort=ascending

output:

0, 1, 3, 4, 7, 9, 12, ... 95, 97, 98, 99 (determinístico)

// IMPLEMENTE VOCÊ MESMO

Se preferir colocar o algoritmo diretamente no seu próprio projeto, aqui estão as três primitivas sobre as quais esta ferramenta é construída. Juntas, elas cobrem inteiros criptográficos sem viés, fluxos determinísticos com semente e a transformação de uma cadeia de semente arbitrária em um estado de PRNG de 32 bits. Todas em domínio público ou equivalente ao MIT.

[JavaScript]

Inteiro criptograficamente seguro em [min, max] (sem viés de módulo)

function secureRandomInt(min, max) {
  const range = max - min + 1;
  const buf = new Uint32Array(1);
  const max32 = 0xFFFFFFFF;
  const limit = Math.floor((max32 + 1) / range) * range;
  let v;
  do {
    crypto.getRandomValues(buf);
    v = buf[0];
  } while (v >= limit);
  return min + (v % range);
}
[JavaScript]

mulberry32 — PRNG determinístico com semente (estado de 32 bits, período ~2^32)

function mulberry32(seed) {
  let a = seed >>> 0;
  return function () {
    a = (a + 0x6D2B79F5) | 0;
    let t = a;
    t = Math.imul(t ^ (t >>> 15), t | 1);
    t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
  };
}

// usage: const rng = mulberry32(0xC0FFEE);
//        rng(); // 0.6743..., reproducible across runs
[JavaScript]

cyrb53 — hash rápido de cadeia para 32 bits (use para semear mulberry32)

function cyrb53(str, seed) {
  seed = seed || 0;
  let h1 = 0xdeadbeef ^ seed;
  let h2 = 0x41c6ce57 ^ seed;
  for (let i = 0; i < str.length; i++) {
    const ch = str.charCodeAt(i);
    h1 = Math.imul(h1 ^ ch, 2654435761);
    h2 = Math.imul(h2 ^ ch, 1597334677);
  }
  h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^
       Math.imul(h2 ^ (h2 >>> 13), 3266489909);
  h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^
       Math.imul(h1 ^ (h1 >>> 13), 3266489909);
  return (h1 >>> 0);
}

// const rng = mulberry32(cyrb53('my-seed-string'));

// ARMADILHAS COMUNS

> Viés de módulo

O ingênuo Math.floor(Math.random() * range) distribui os bits mais altos de forma desigual quando o intervalo não é uma potência de dois — algumas saídas ocorrem ligeiramente mais vezes que outras. Use amostragem por rejeição (o trecho acima) para descartar sorteios fora do intervalo e manter a distribuição uniforme.

> Math.random() não é criptograficamente seguro

Math.random() no V8/Spidermonkey usa xorshift128+, que é rápido mas previsível: um atacante que observa algumas saídas pode recuperar o estado interno e prever valores futuros. Para tokens, sais, sorteios de loteria críticos quanto à justiça ou qualquer coisa que importe a um adversário, sempre use crypto.getRandomValues().

> PRNGs com semente são determinísticos — nunca os use para segurança

Mulberry32 e similares são projetados para se repetir. É exatamente o que você quer para testes, simulações e distribuição — e exatamente o que você não quer para tokens de redefinição de senha ou IDs de sessão. Se você se vir canalizando uma semente para algo voltado ao usuário ou próximo da autenticação, volte imediatamente ao CSPRNG.

> A rejeição de duplicatas em alta quantidade esgota a capacidade

Pedir k inteiros únicos de um intervalo de tamanho n em que k se aproxima de n se torna um problema do colecionador de cupons: os últimos sorteios ficam exponencialmente caros. Esta ferramenta limita a 10.000 e usa amostragem parcial de Fisher-Yates para que a capacidade seja exata, mas um laço while ingênuo com seen.has(x) travará silenciosamente quando k > n. Sempre verifique a capacidade de antemão.

>> perguntas frequentes

P: Este gerador de números aleatórios é criptograficamente seguro?

R: Sim, por padrão. Quando você deixa o campo SEMENTE vazio, a ferramenta usa crypto.getRandomValues(), o CSPRNG da Web Crypto API, que no Linux/macOS lê de /dev/urandom e no Windows de BCryptGenRandom. Também aplicamos amostragem por rejeição para que o mapeamento de um inteiro de 32 bits para o seu intervalo personalizado seja sem viés. A saída é adequada para tarefas próximas à segurança, como gerar tokens, escolher sais ou realizar loterias justas. Observe que fornecer uma semente alterna para um PRNG determinístico (mulberry32), que não é criptograficamente seguro — use-o apenas quando a reprodutibilidade importar mais que o sigilo.

P: Qual é a diferença entre o modo com semente e sem semente?

R: O modo sem semente (padrão) usa o CSPRNG do seu navegador e produz números novos e imprevisíveis a cada clique — a mesma chamada nunca retornará a mesma sequência duas vezes. O modo com semente converte a cadeia de semente em um inteiro de 32 bits com cyrb53 e a alimenta ao mulberry32, um PRNG determinístico. Semente idêntica mais configurações idênticas sempre geram a sequência idêntica, o que é inestimável para experimentos reproduzíveis, depuração de código estocástico, compartilhamento de fixtures de teste ou distribuição de testes A/B em que cada usuário deve sempre cair no mesmo grupo.

P: Como funciona a opção sem duplicatas?

R: Para inteiros, a opção sem duplicatas sorteia do intervalo [min..max] usando um embaralhamento parcial inspirado em Fisher-Yates que retorna os primeiros k elementos sem nunca repetir. Usamos um mapa de troca esparso para que o uso de memória permaneça em O(count) em vez de O(range), o que significa que um sorteio de 10 números únicos de 1 a 1.000.000 é tão barato quanto 10 de 1 a 100. Se você pedir mais números únicos do que o intervalo pode fornecer (por exemplo, 20 inteiros únicos em 1–10), a ferramenta relata um erro de capacidade claro em vez de entrar em laço indefinidamente.

P: Posso gerar números aleatórios decimais (ponto flutuante)?

R: Sim. Mude o seletor TIPO para Decimal e escolha uma precisão entre 1 e 10 casas. O gerador sorteia um valor em ponto flutuante uniforme em [0, 1), escala-o para [min, max), depois arredonda com toFixed(places) e o converte de volta para um número. Observe que max é exclusivo no modo decimal (um efeito colateral de como a uniformidade em ponto flutuante é definida). Para a maioria dos usos estatísticos, 4–6 casas decimais são suficientes; dez casas se aproximam do limite da precisão dupla IEEE 754 para intervalos pequenos típicos.

P: Existe uma quantidade máxima?

R: A quantidade é limitada a 10.000 números por clique. Isso mantém a página responsiva em telefones e evita comportamentos extremos do navegador em áreas de texto extremamente grandes. Se você precisar de milhões de valores, execute vários lotes com sementes diferentes e concatene a saída, ou copie o algoritmo para um script Node — o mesmo par mulberry32 / cyrb53 funciona também no lado do servidor. Por razões de experiência do usuário, a ordenação, a cópia e o download acontecem todos no lado do cliente, então 10 mil é um teto sensato que ainda termina em bem menos de um milissegundo em um laptop moderno.

P: Meus dados são enviados para algum lugar?

R: Não. Toda operação roda no seu navegador como JavaScript puro: geração de números, ordenação, estatísticas, cópia para a área de transferência e download do arquivo .txt. Nenhuma requisição é enviada aos nossos servidores quando você clica em GENERATE, COPY ou DOWNLOAD — você pode verificar com a aba Rede do seu navegador. Não registramos sementes, intervalos ou saídas. A página é HTML estático servido por HTTPS de uma CDN, portanto nada da sua entrada é observável para nós. Isso torna a ferramenta segura para fixtures de teste confidenciais, sementes de loteria internas ou qualquer outra coisa que você prefira manter fora de servidores de terceiros.

P: Posso evitar duplicatas ao gerar números decimais?

R: Sim, a caixa sem duplicatas também se aplica aos decimais usando um laço de nova tentativa de melhor esforço. Como dois valores em ponto flutuante amostrados independentemente quase nunca colidem no nível de bits, duplicatas são raras a menos que seu intervalo seja minúsculo em relação à precisão (por exemplo, min=0, max=1, places=2 tem apenas 100 valores distintos). Se o laço não conseguir encontrar valores únicos suficientes dentro de um número razoável de tentativas, a ferramenta relata um erro de capacidade para que você possa ampliar o intervalo ou aumentar a precisão. Para decimais estritamente garantidos como únicos, prefira o modo inteiro e divida o resultado você mesmo.

P: Quando devo usar uma roleta giratória em vez de uma lista de números?

R: Uma lista de números é melhor para tarefas em lote: sortear 50 bilhetes de loteria, gerar dados de teste ou alimentar uma simulação. Uma roleta giratória é melhor quando uma pessoa escolhe um item diante de um público e você quer o suspense e o impacto visual — escolha de nomes em sala de aula, sorteios em livestream, rodízio de tarefas das crianças, reuniões de decisão. Se esse for o seu caso de uso, veja randompickerwheel.app, que oferece uma interface interativa de roleta giratória feita exatamente para esse momento. Ambas as ferramentas sorteiam da mesma primitiva CSPRNG — a diferença é a apresentação, não a justiça.

// OTHER LANGUAGES