Originalmente respondido: para una computadora, ¿qué tan aleatorio es ser aleatorio?
Esta pregunta tiene dos respuestas: 1) nada aleatorio o 2) completamente aleatorio.
1) Nada aleatorio
- ¿Cuál es la mejor manera de aprender a escribir algoritmos?
- En la complejidad temporal de un algoritmo, ¿por qué puede considerarse útil que una operación elemental tome "tiempo unitario"?
- Cómo construir robots enjambre
- ¿Cómo podemos generar k enteros aleatorios únicos en el rango [1 ... n] con igual probabilidad?
- Cómo generar un número aleatorio en C
En este caso, hay un algoritmo llamado generador de números pseudoaleatorios (PRNG) que hace algo de discusión para crear una secuencia de números aleatorios. Este algoritmo generalmente es una máquina de estados que toma los valores en algún estado interno, manipula los bits a través de varias operaciones y produce otro número en la serie. Si conoce el estado interno del sistema, puede predecir el siguiente número, ya que es simplemente la misma serie de operaciones.
Puede pensar que estos generan una sola serie de números en el mismo orden que es muy, muy larga. Para obtener una serie de números aleatorios, simplemente elija un punto de inicio inicial en la serie muy larga y tome cada número como el próximo “número aleatorio”.
Supongamos que tenemos esta serie:
54100 2 14 65432 19 14 37105 56 13772105 19
Si comenzara al principio y escogiera 5 números, obtendría
54 100 2 14 65
Pero si comenzara en el 37 obtendría
37 105 56 13 172
Así es como funciona un PRNG, lo que significa que es periódico. Si elijo suficientes números aleatorios, eventualmente llegaré a un estado que es el mismo que el estado inicial y los números comenzarán a repetirse. Cuanto más largo sea el período de PRNG, mejor será PRNG para un uso sostenido.
Un PRNG requiere una semilla que se define como el estado inicial del sistema interno. Generalmente, se trata de una serie de series de números (que es en realidad un número determinado de bits) que inicializan el estado interno del PRNG, estableciendo el número inicial en un número determinado de la serie. Si usa la misma semilla, obtendrá los mismos números exactamente en el mismo orden.
Prueba esto, ve a este sitio:
Planet Map Generator
Ingrese 2016 como semilla, haga clic en “Crear mapa” y obtendrá este mapa:
Este es el mapa generado por el creador del mapa utilizando un PRNG con “2016” como estado inicial. Siempre generará este mapa. Otra semilla generará un mapa diferente.
Usar la misma semilla puede ser muy útil. En los juegos que generan aleatoriamente un mundo o un mapa de juego, cada semilla se convierte en un mapa o juego diferente. Esto se usa en Spider Solitaire como una forma de enviar un juego a otra persona. Puedes decir que el juego “1456234” es muy fácil y otro jugador puede ingresarlo como semilla para obtener el mismo juego. Otro ejemplo es en Minecraft, donde puedes ingresar una semilla en el mundo generador y generar el mismo mundo en cualquier sistema. Ahora, si quieres darle un mundo genial a un amigo, no tienes que enviar tu partida guardada, solo la semilla. Eso es en los juegos, en el mundo de la simulación es mucho más importante tener números aleatorios repetibles.
He escrito muchas simulaciones químicas, donde un número dado de moléculas o átomos están dispuestos en un espacio tridimensional e iteración por iteración, el simulador intenta determinar cómo interactúan esos a distancias y rotaciones dadas. Para determinar el estado “final” de la reacción, la simulación se ejecuta una y otra vez con diferentes semillas y los resultados se correlacionan para determinar los posibles estados de reacción (función softmax). Eso significa que necesito diferentes semillas para las diferentes ejecuciones, pero cuando estoy codificando el software, necesito los mismos números aleatorios una y otra vez durante el desarrollo para permitirme depurar el programa. Esto es necesario porque un error puede aparecer solo en un cierto estado inicial de las moléculas y si fuera aleatorio, nunca podría repetir esa misma configuración en varias sesiones de depuración. Una vez que el software está “libre de errores” (ja), la semilla se almacena como parte de cada ejecución, por lo que si ocurre un error, puedo ingresar esa semilla y depurar lo que salió mal.
2) completamente
Algunos dispositivos de hardware utilizan las propiedades de un dispositivo analógico o un sensor físico para crear números aleatorios reales. Esto podría ser algún efecto secundario como el ruido de avalancha o un semiconductor de polarización inversa, pero también podría ser un sensor físico como un sensor fotoeléctrico que cuenta el número de fotones que golpean un área pequeña en un marco de tiempo determinado. Estos dispositivos, conocidos como un generador de números aleatorios de hardware, son verdaderamente aleatorios y tienen un rendimiento que permite leer un número determinado de bits del dispositivo en un segundo. Esto generalmente está en kilobits por segundo, pero podría estar en megabits. En este caso, es verdaderamente aleatorio, ya que utiliza el ruido o el entorno para crear una secuencia de números aleatorios.
Aquí hay un tuyo:
waywardgeek / infnoise
Aquí hay un popular, listo para usar:
TrueRNG V2 de Ubld.It Electronics
Incluso sin un RNG de hardware, puede usar un PRNG y agregar entropía al estado interno de vez en cuando para mantener el algoritmo creando buenos números aleatorios. Muchas veces, el RNG de hardware se usa para inicializar un PRNG en lugar de leerlo directamente. Luego, el PRNG tomará cada segundo algo de entropía del hardware RNG (para más información sobre entropía, consulte ¿Cómo funciona un generador de números aleatorios en los lenguajes de programación? ¿Hay algún patrón?)