← Volver al Blog

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

Herramientas y equidad30 de marzo de 2026·7 min de lectura
Random number generator fairness audit

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:

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:

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

  1. Fuente de entropía — ¿El RNG se genera a partir de una fuente criptográfica? (No Math.random, no marcas de tiempo)
  2. Prueba de uniformidad: ejecute más de 10 000 muestras y aplique una prueba de chi-cuadrado. El valor p debe ser > 0,05
  3. Sesgo de módulo — ¿El código utiliza muestreo de rechazo o un método de mapeo imparcial?
  4. Independence — ¿Están correlacionados los sorteos secuenciales? Ejecute una prueba de autocorrelación en conjuntos de muestras grandes
  5. 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
  6. Divulgación de filtrado: ¿Se filtra, se repite o se excluye algún resultado? Esto debe ser revelado
  7. 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:

  1. 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
  2. Ejecuta el sorteo: Usa la semilla para generar resultados con un algoritmo determinista
  3. 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) === compromiso

Comunicar equidad a los usuarios

La confianza requiere transparencia. Al realizar sorteos públicos:

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