A função
JavaScript
const dv = (nums, p0) => {
let s = 0, p = p0;
for (const n of nums) { s += n * p; p--; }
const r = s % 11;
return r < 2 ? 0 : 11 - r;
};
function generateCPF({ mask = false } = {}) {
const base = Array.from({ length: 9 }, () => Math.floor(Math.random() * 10));
const d1 = dv(base, 10), d2 = dv([...base, d1], 11);
const s = [...base, d1, d2].join('');
return mask ? s.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-$4') : s;
}
generateCPF(); // '11144477735'
generateCPF({ mask: true }); // '111.444.777-35'Sorteia 9 dígitos de base, calcula o 1º verificador com pesos 10..2 e o 2º com pesos 11..2 (incluindo o 1º DV no cálculo). O resto da divisão por 11 vira o dígito: resto < 2 ? 0 : 11 - resto. É o módulo 11 aplicado para frente.
Validar o que você gerou
A mesma função dv serve para conferir. Útil em teste: gere, valide, garanta que o algoritmo fecha.
JavaScript
function isValidCPF(cpf) {
cpf = String(cpf).replace(/\D/g, '');
if (cpf.length !== 11 || /^(\d)\1{10}$/.test(cpf)) return false;
const n = cpf.split('').map(Number);
const d1 = dv(n.slice(0, 9), 10);
const d2 = dv(n.slice(0, 9).concat(d1), 11);
return d1 === n[9] && d2 === n[10];
}
isValidCPF(generateCPF()); // truepublicidade
Cuidados
- Número fictício, não real. A função gera um CPF que passa no módulo 11, mas não corresponde a nenhuma pessoa. É para teste de software e QA — ver se é legal gerar CPF/CNPJ.
- Válido ≠ existe. Consistência matemática não é emissão pela Receita. Não use saída de gerador como dado de pessoa real.
- Sequências repetidas (
11111111111) são tecnicamente consistentes no módulo 11; o validador acima as rejeita de propósito, mas o gerador quase nunca as produz (base aleatória). - Math.random não é criptográfico. Para massa de teste tudo bem; se precisar de imprevisibilidade real, troque por
crypto.getRandomValues. - Guarde sem máscara (só os 11 dígitos) e formate só na exibição.
Continue
Código verificado por execução: a saída passa no validador (módulo 11 oficial). Números fictícios para teste de software. Revisado em 06/2026.