COREDE Vale do Rio dos Sinos — CONSINOS | Nova Hartz
O sorteio utiliza o algoritmo Fisher-Yates (também chamado de Knuth Shuffle), reconhecido como o embaralhamento aleatório imparcial por construção matemática: cada permutação possível dos candidatos tem exatamente a mesma probabilidade de ocorrer.
Os números aleatórios são gerados por crypto.randomInt() do Node.js,
que usa o CSPRNG do sistema operacional (equivalente a /dev/urandom no Linux ou
BCryptGenRandom no Windows). Isso garante que os resultados
não podem ser previstos ou manipulados.
Referência: Wikipedia — Fisher–Yates shuffle | Node.js crypto.randomInt()
Código-fonte exato executado no servidor:
// Candidatos na ordem de inscrição (determinística) const arr = [...candidatos]; const passos = []; // Fisher-Yates: para i de n-1 até 1 for (let i = arr.length - 1; i > 0; i--) { // Sorteia j aleatório em [0, i] — CSPRNG const j = crypto.randomInt(0, i + 1); // Registra o passo para auditoria passos.push({ i, j, trocou: i !== j }); // Troca posições i e j [arr[i], arr[j]] = [arr[j], arr[i]]; } // Os primeiros numVagas do array embaralhado são os eleitos const eleitos = arr.slice(0, numVagas);
💡 Como verificar manualmente: com a lista de candidatos na ordem de inscrição e os passos registrados abaixo, qualquer pessoa pode reproduzir exatamente o mesmo resultado aplicando as trocas na sequência registrada.
Rode N sorteios simulados com os mesmos candidatos e veja se a distribuição é uniforme. Num algoritmo justo, cada candidato deve ser eleito aproximadamente — das vezes (vagas ÷ candidatos).
Log bruto completo do sorteio. Pode ser salvo como prova documental.