Pulsas un botón, aparece un número y se da por hecho que es aleatorio. La pregunta que merece la pena hacerse es qué lo produjo, porque una de las dos respuestas es verificable y la otra no.
De Dónde Viene la Aleatoriedad Genuina
La aleatoriedad verdadera proviene de procesos físicos que no están determinados por un estado previo:
- Desintegración radiactiva — el momento exacto en que un átomo se desintegra no se puede predecir
- Ruido térmico — fluctuaciones aleatorias de voltaje en una resistencia
- Ruido atmosférico — la estática de fondo de la actividad de los rayos
- Medición cuántica — resultados genuinamente indeterminados
No son aproximaciones de la aleatoriedad. Son aleatorios, en el sentido de que ningún conocimiento del pasado determina el resultado.
Qué Hace un Ordenador en su Lugar
Un ordenador no puede observar ninguno de estos procesos directamente, así que un generador de hardware los muestrea. Los bytes en bruto provienen de algo como /dev/urandom o la fuente equivalente del sistema operativo, que a su vez se inicializa a partir de procesos físicos. Eso es un generador de números aleatorios verdadero.
El caso mucho más común es un generador de números pseudoaleatorios: un algoritmo determinista que produce una secuencia que solo parece aleatoria.
next = (previous × multiplier + increment) mod modulus
La propiedad crítica no es sutil. Si conoces el algoritmo y la semilla, puedes calcular cada valor que producirá la secuencia. No de forma aproximada: exactamente.
Por eso Math.random(), que usan casi todos los sitios web, no sirve para nada que importe. Su salida está determinada por el estado interno. Recupera ese estado a partir de las salidas observadas y cada tirada futura se vuelve predecible.
El ejemplo que más se cita es que el estado completo de un generador congruencial lineal se puede recuperar a partir de unas pocas salidas consecutivas. Mersenne Twister, el predeterminado en Python, necesita 624 salidas para reconstruirse, y 624 es una cifra que alcanzarás en segundos.
Xorshift y generadores rápidos similares tienen la misma propiedad de otra forma: excelente calidad estadística, totalmente predecibles si tienes el estado.
El Punto Intermedio que Realmente Importa
Esta es la parte que la mayoría de las explicaciones se salta, y es la que decide la respuesta en la práctica.

Las plataformas web modernas no usan /dev/urandom en bruto en cada llamada. Usan un PRNG criptográficamente seguro: un algoritmo determinista, pero inicializado a partir de entropía de hardware y diseñado para que observar las salidas no te permita recuperar el estado.
Merece la pena ser preciso con la distinción, porque las dos cosas se confunden:
| TRNG de hardware | CSPRNG | PRNG ordinario | |
|---|---|---|---|
| Basado en entropía física | Sí | Sí | No |
| Determinista dado el estado | No | Sí | Sí |
| La salida revela el estado | No | No | Sí |
| Adecuado para un sorteo de premios | Sí | Sí | No |
Un CSPRNG es determinista en el mismo sentido en que lo es cada pieza de software que usas. Lo que lo hace aceptable es que el estado no se puede recuperar a partir de lo que ya ha emitido.
Los navegadores exponen exactamente esto mediante crypto.getRandomValues(). Es la fuente de la que beben los sorteos de RandomSelect.
La Justicia es una Segunda Cuestión
La uniformidad es fácil de hacer mal incluso con una buena fuente. Un d6 es sencillo: seis valores con la misma probabilidad. Un d7 no lo es, y “elige 1 de 40 nombres” tampoco.
El enfoque ingenuo — escalar un número decimal aleatorio de 0 a 1 al rango — sesga el extremo inferior. Con 40 nombres, el primero aparecería con una frecuencia ligeramente mayor que el último, porque algunos valores aleatorios caen más allá del final del último intervalo y se descartan de forma desigual.
El enfoque correcto es el muestreo por rechazo: extrae un valor y, si el resultado cae en el intervalo final incompleto, descártalo y vuelve a extraer. La distribución se vuelve exactamente uniforme.
Es fácil pasarlo por alto porque el sesgo es pequeño. En la práctica, la implementación rechaza los valores fuera de rango y vuelve a extraer, de modo que cada entrada tiene exactamente una probabilidad de 1/N, incluso en un sorteo de 40 nombres, donde una implementación con número decimal escalado daría al primer nombre una probabilidad ligeramente mayor.
La misma técnica aparece en el generador de identificadores cortos, donde el comentario del código anota la tasa de aceptación y el sesgo resultante de unas dos partes en diez millones. Lo bastante pequeño para ser irrelevante y lo bastante pequeño como para que una implementación descuidada hubiera pasado desapercibida, que es exactamente el motivo de medirlo.
Qué Significa Esto en la Práctica
Para elegir un almuerzo, nada de esto importa. Cualquier generador produce un almuerzo aceptable.
Para un sorteo de premios, una asignación de empleados o cualquier cosa con una reputación asociada, la pregunta es si el resultado se podría haber anticipado. Con Math.random(), en principio sí. Con crypto.getRandomValues(), no: esa es la diferencia entre “decimos que era aleatorio” y “el mecanismo hace que lo sea”.
Hay un punto relacionado y que se confunde con frecuencia sobre la animación. En una ruleta giratoria, el resultado se fija antes de que la ruleta empiece a moverse; la animación avanza hacia él. Algunos lectores lo toman como prueba de manipulación. Es lo contrario: como el resultado ya está determinado y no se puede influir en él con el momento, no hay ninguna entrada que nadie pueda explotar. Lo visual es teatro sobre un valor que ya está fijado.
Comprobarlo Tú Mismo
Un ejercicio rápido que no necesita código: tira un dado veinte veces y anota los resultados. Luego busca rachas.
Las encontrarás. Tres seises seguidos ocurren aproximadamente una vez cada cincuenta tiradas. No es señal de que el dado esté cargado: es lo que parece un proceso justo cuando examinas una muestra corta.
Luego tira cien veces y cuenta cada cara. Las diferencias se estrechan. Nadie está convergiendo, porque nunca hubo un déficit que cerrar: esto es lo que significa la independencia cuando miras con suficiente atención.
Dónde Leer Más
La página de imparcialidad de este sitio recorre la implementación real, incluido el paso de muestreo por rechazo. Merece la pena leerla una vez, sobre todo si estás eligiendo una herramienta para una decisión que van a cuestionar.
El resumen práctico es breve: una herramienta que usa crypto.getRandomValues() y rechaza las extracciones fuera de rango hace lo correcto, y no necesitas creerte su palabra: puedes razonar sobre el mecanismo.