No todo el azar es igual. La diferencia entre un generador de números pseudo-aleatorios y uno criptográficomente seguro determina si su cambio de moneda, el rollo de dados o el sorteo de nombre es verdaderamente justo — o silenciosamente predecible.
Un generador de números aleatorios (RNG) es un algoritmo o dispositivo de hardware que produce una secuencia de números sin patrón discernible. Las computadoras enfrentan un problema fundamental aquí: son máquinas deterministas. Dado el mismo estado inicial, una CPU siempre producirá la misma salida. La aleatoriedad del hardware verdadero requiere una fuente externa de imprevisibilidad — llamada entropía— como el ruido térmico, la variación del tiempo del disco o el movimiento del ratón.
Software RNGs resuelven esto ya sea reuniendo entropía real del sistema operativo o usando una fórmula matemática para simular aleatoriedad. Estos dos enfoques producen resultados muy diferentes.
Un generador de números pseudo-aleatorios (PRNG) comienza desde el estado interno y aplica un algoritmo determinista para producir cada número sucesivo. La salida puede parecer aleatoria, pero el mismo estado inicial produce la misma secuencia.
JavaScript Math.random() utiliza un PRNG definido en la implementación. La especificación JavaScript no requiere un algoritmo particular y explícitamente no hace que la salida criptográficamente segura. Por lo tanto, es inapropiado cuando la imprevisibilidad o la equidad auditable importa.
Para la mayoría de los propósitos — animaciones, elegir una lista de reproducción, elegir un color de fondo aleatorio— esto no importa. Pero para cualquier cosa donde la equidad está en juego (ganadores, sorteos de equipo, resultados del juego), la previsibilidad es un problema genuino.
Se diseña un generador de números de pseudo-aleatorios criptográficamente seguros (CSPRNG) para que las salidas anteriores no hagan prácticamente predecibles las salidas futuras. En comparación con un PRNG de uso general, proporciona propiedades necesarias por aplicaciones sensibles a la seguridad y sensibles a la equidad:
Los navegadores obtienen valores criptográficomente fuertes de las instalaciones del sistema operativo. Las fuentes exactas de entropía y los algoritmos son detalles de la plataforma, por lo que las aplicaciones web deben utilizar la API Web Crypto en lugar de intentar recoger o gestionar entropía ellos mismos.
crypto.getRandomValues()Los navegadores exponen la funcionalidad CSPRNG a través de la API Crypto Web. La función clave es crypto.getRandomValues(typedArray), que llena una matriz de tipo con bytes criptográficos aleatorios provenientes de la piscina entropía del sistema operativo.
Para generar un entero imparcial en un rango, Randly lee un valor de 32 bits (o combina valores para mayores rangos de entero seguro) y rechaza la cola corta que de otra manera crearía sesgo de modulo:
función randomUint32() {
const array = nuevo Uint32Array(1);
crypto.getRandomValues (array);
[0];
}
función randomInt(min, max) {
const range = max - min + 1;
límite de const = Math.floor(2 ** 32 / rango) * rango;
;
do value = randomUint32(); while (value >= limit);
retorno min + (valor % rango);
}
A Uint32Array proporciona 232 valores posibles; Combina Randly 53 bits cuando se necesita un rango de entero seguro más amplio. El muestreo de rechazo asegura que cada salida en el rango solicitado corresponde al mismo número de valores de origen, por lo que ningún resultado recibe una cuota más grande simplemente porque el rango solicitado no divide el rango de fuente uniformemente.
Para la mayoría de los usos casuales, la distinción es invisible. Pero considere a un profesor de aula usando un nombre para llamar a los estudiantes, o a una organización que ejecute un sorteo de premios. Un PRNG de uso general no se especifica para uso contencioso, mientras que una plataforma CSPRNG está diseñada para mantener los valores futuros impredecibles. Un proceso auditado sigue siendo adecuado para sorteos regulados o de alto valor.
Cada herramienta en Randly — rollos de dados, volteretas de monedas, selecciones de nombre, giros de rueda, generación de color — utiliza crypto.getRandomValues() exclusivamente. La implementación vive en un solo módulo compartido (lib/random.ts) que las exportaciones clasifican funciones: randomInt(min, max), randomIndex(duración), randomElement(array), y shuffleArray (array).
No hay llamada Math.random() existe en cualquier lógica de herramienta. Los valores estándar de PRNG sólo aparecen en los parámetros de animación Framer Motion (posiciones de inicio de elementos flotantes), que son puramente cosméticos y no tienen efecto en los resultados de la herramienta.
"Haciendo clic más rápido hace que el resultado sea más aleatorio".
El momento de su clic no tiene efecto al usar un CSPRNG. La piscina entropía es continuamente refrescada por el sistema operativo, independientemente de la interacción del usuario.
"Running the same tool twice in a row gives correlated results."
Cada llamada a crypto.getRandomValues() es independiente. Los productos anteriores no proporcionan información sobre los futuros.
"Una lista más larga significa que alguien al final es menos probable que sea elegido."
La selección del índice aleatorio da a cada posición una probabilidad igual de 1/n, independientemente de la longitud de la lista.
Todas las herramientas Randly usan aleatoriedad criptográficamente segura. No se requiere registro.