¿Es justo su generador de números aleatorios? Lista de verificación práctica de auditoría

Cuando realizas una rifa, eliges equipos al azar o asignas tareas por sorteo, la equidad no es opcional: es el objetivo. Pero "aleatorio" no significa automáticamente "justo". Los sesgos ocultos en los generadores de números aleatorios (RNG) pueden sesgar los resultados de maneras que son invisibles a menos que sepa dónde buscar.
Este artículo le brinda una lista de verificación práctica para auditar la imparcialidad de cualquier RNG, ya sea que esté utilizando nuestro Generador de números aleatorios o creando el suyo propio.
Qué significa la equidad para los sorteos de cara al usuario
Un RNG justo produce resultados donde:
- Uniformidad — cada resultado tiene la misma probabilidad (para distribuciones uniformes)
- Independencia — cada sorteo no se ve afectado por sorteos anteriores
- Imprevisibilidad — ningún observador puede predecir el próximo resultado mejor que el azar
- Verificabilidad — los participantes pueden confirmar que el proceso no fue manipulado
La falta de cualquiera de estos rompe la confianza, incluso si los resultados "parecen" aleatorios.
Fuentes comunes de sesgo
Semillas malas
A PRNG (generador de números pseudoaleatorios) es tan impredecible como su semilla. Semillas malas comunes:
- Marca de tiempo actual — predecible al milisegundo; un atacante que sabe aproximadamente cuándo se ejecuta el sorteo puede reproducir el resultado
- Contadores secuenciales — nada aleatorio
- Entrada del usuario — puede ser manipulado por los participantes
Semilla siempre de una fuente criptográfica: crypto.getRandomValues() en navegadores, /dev/urandom en Linux, o crypto.randomBytes() en Nodo.js.
Módulo Bias
Un error sutil y común: usar el operador de módulo para reducir un número aleatorio a un rango.
// BIASED — si el rango RNG no es múltiplo de 6,
// algunos resultados son ligeramente más probables
tirada constante = randomUint32() % 6; // CORRECTO — muestreo de rechazo
función fairDiceRoll() { constante máx = Math.floor(0xFFFFFFFF / 6) * 6; dejar valor; hacer { value = crypto.getRandomValues(new Uint32Array(1))[0]; } mientras (valor >= máximo); valor de retorno% 6;
}Para un dado de 6 caras, el sesgo de módulo con un entero de 32 bits es solo ~0,00000009%. Pero para rangos más grandes o valores de 8 bits, se vuelve significativo.
Filtros ocultos
Algunos sistemas de sorteo excluyen silenciosamente ciertos resultados (por ejemplo, filtrando "ganadores recientes" o volviendo a lanzar resultados que al operador no le gustan). Esto viola la equidad incluso si el RNG subyacente es perfecto. Documente y divulgue cualquier regla de filtrado antes del sorteo.
Lista de verificación de auditoría para operadores
- Fuente de entropía — ¿El RNG se genera a partir de una fuente criptográfica? (No Math.random, no marcas de tiempo)
- Prueba de uniformidad: ejecute más de 10 000 muestras y aplique una prueba de chi-cuadrado. El valor p debe ser > 0,05
- Sesgo de módulo — ¿El código utiliza muestreo de rechazo o un método de mapeo imparcial?
- Independence — ¿Están correlacionados los sorteos secuenciales? Ejecute una prueba de autocorrelación en conjuntos de muestras grandes
- Revisión de código — ¿El código de extracción es de código abierto o auditable? El código oculto puede contener puertas traseras
- Divulgación de filtrado: ¿Se filtra, se repite o se excluye algún resultado? Esto debe ser revelado
- Timing — ¿Puede el operador ver los resultados antes de publicarlos? En caso afirmativo, pueden descartar selectivamente sorteos desfavorables
Patrón de transparencia para sorteos públicos
Para sorteos de alto riesgo (premios, asignaciones, selecciones), utilice un esquema de compromiso-revelación:
- Antes del sorteo: Genera una semilla aleatoria. Publicar su hash SHA-256 (el "compromiso"), por ejemplo, en las redes sociales o en un documento con marca de tiempo
- Ejecuta el sorteo: Usa la semilla para generar resultados con un algoritmo determinista
- Después del sorteo: Publicar la semilla. Cualquiera puede verificar que:
- La semilla produce el hash publicado
- El algoritmo semilla + produce los resultados anunciados
Utilice nuestro Hash Generator para crear y verificar el hash de compromiso.
// Fase de compromiso
semilla const = crypto.randomBytes(32).toString('hex');
compromiso constante = sha256(semilla); // publica esto antes del sorteo // Fase de sorteo
resultado constante = sorteo determinista (semilla, participantes); // Fase de revelación
// publicar semilla: cualquiera puede verificar sha256(seed) === compromisoComunicar equidad a los usuarios
La confianza requiere transparencia. Al realizar sorteos públicos:
- Indique el método RNG utilizado (por ejemplo, "Web Crypto API")
- Publicar el algoritmo de dibujo (incluso el pseudocódigo ayuda)
- Utilice confirmación-revelación para verificabilidad
- Registrar y publicar registros de sorteos con marcas de tiempo
- Permitir que observadores independientes verifiquen los resultados
Preguntas frecuentes
¿Es Math.random lo suficientemente bueno?
No. Math.random() utiliza un generador de números pseudoaleatorios (PRNG) que no es criptográficamente seguro. Su resultado se puede predecir si se conoce el estado interno. Para sorteos justos, use crypto.getRandomValues() en el navegador o crypto.randomInt() en Node.js.
¿Cómo puedo demostrar que un sorteo no fue manipulado?
Utilice un esquema de confirmación-revelación: antes del sorteo, publique un hash de la semilla aleatoria (compromiso). Después del sorteo, revela la semilla. Cualquiera puede verificar que la semilla produce el hash publicado y los resultados anunciados.
¿Cuántas muestras necesito para realizar comprobaciones de sesgo básicas?
Para una verificación simple de uniformidad en N resultados, necesita al menos 100 × N muestras (por ejemplo, 1000 muestras para un sorteo de 10 opciones). Aplique una prueba de chi-cuadrado: si el valor p es superior a 0,05, la distribución es razonablemente uniforme. Para auditorías serias, utilice más de 10 000 muestras.
Herramientas y artículos relacionados
- Generador de números aleatorios — números aleatorios criptográficamente justos
- Generador de hash: crea hashes de compromiso para sorteos verificables
- ¿Por qué utilizar un generador de PIN? — PIN aleatorios seguros
- Lista de verificación de higiene digital — prácticas generales de seguridad