Un Generador aleatorio es una herramienta o algoritmo que produce resultados impredecibles y no deterministas. Estos generadores son esenciales en muchos ámbitos, desde la criptografía a la simulación informática.
- Resultados imprevisibles: Los generadores aleatorios ofrecen resultados imprevisibles.
- Uso en criptografía: Son cruciales para una comunicación segura.
- Simulaciones por ordenador: Se utiliza con frecuencia en la modelización y el análisis de sistemas complejos.
Generador de números aleatorios
¿Cómo funciona un generador de números aleatorios? ?
Los generadores aleatorios funcionan con procesos físicos o algoritmos matemáticos. Los tipos más importantes son los generadores de números aleatorios verdaderos (TRNG) y los generadores de números pseudoaleatorios (PRNG).
¿Dónde se juega al blackjack en línea?
Hemos tenido las mejores experiencias en Black Jack en el Playamo Casino en vivo hecho. En mi opinión, ahí es donde está, MEJOR SELECCIÓN ¡en mesas con crupieres en vivo y puedes entrenarte muy bien para el casino real! ¡Comparado con otros casinos online, las ganancias en Playamo son realmente pagadas y es por eso que definitivamente recomiendo Playamo Casino Online!
El Casino Playamo cuenta con numerosas mesas de blackjack en vivo y un Pago rápido de Ganar.
Las diversas aplicaciones de la aleatoriedad han llevado al desarrollo de diferentes métodos para generar datos aleatorios. Algunos de ellos existen desde la antigüedad, con ejemplos tan conocidos como el lanzamiento de dados, el lanzamiento de monedas, el barajado de naipes, el uso de tallos de milenrama (para la adivinación) en el I Ching y un sinfín de técnicas más. Debido a la naturaleza mecánica de estas técnicas, generar grandes cantidades de números suficientemente aleatorios (importantes en estadística) requería mucho trabajo y tiempo. Por eso, a veces los resultados se recopilaban y distribuían en forma de tablas de números aleatorios.
Existen varios métodos computacionales para generar números pseudoaleatorios. Todos ellos no logran alcanzar el objetivo de la verdadera aleatoriedad, aunque sí cumplen, con mayor o menor éxito, algunos de los requisitos estadísticos de los números pseudoaleatorios. Pruebas para la aleatoriedad, que están diseñados para medir lo impredecibles que son sus resultados (es decir, hasta qué punto son reconocibles sus patrones). Esto hace que, en general, sean inutilizables para aplicaciones como la criptografía. Sin embargo, también existen generadores de números pseudoaleatorios criptográficamente seguros (CSPRNGS) cuidadosamente diseñados con características especiales diseñadas específicamente para la Insertar se desarrollaron en criptografía.
Aplicaciones de los generadores aleatorios
- Juegos y entretenimiento:
- Los generadores aleatorios se utilizan en los juegos para crear elementos impredecibles, como tiradas de dados, robos de cartas o generación de niveles.
- Criptografía:
- En seguridad de la información, los generadores de números aleatorios son cruciales para la generación de claves, sales y nonces, necesarios para el cifrado y la autenticación.
- Estadísticas y muestras:
- Al crear muestras para encuestas y estudios, los generadores aleatorios ayudan a extraer muestras representativas e imparciales.
- Modelos de simulación:
- En ciencia y tecnología, los generadores de números aleatorios se utilizan para realizar simulaciones Monte Carlo que emplean variables aleatorias para modelar y analizar sistemas complejos.
- Loterías y concursos:
- Garantizan la selección justa y aleatoria de los ganadores en loterías, sorteos y otros concursos.
- Algoritmos de optimización:
- Los métodos aleatorios, como los algoritmos genéticos y el recocido simulado, utilizan generadores aleatorios para buscar eficazmente espacios de soluciones y encontrar soluciones óptimas.
- Inteligencia artificial y aprendizaje automático Aprender:
- Se utilizan generadores aleatorios para mezclar conjuntos de datos y seleccionar aleatoriamente datos de entrenamiento y de prueba para validar y entrenar los modelos.
Los generadores de números aleatorios tienen aplicaciones en Juegos de azaren el muestreo estadístico, la simulación informática, la criptografía, el diseño totalmente aleatorio y otras áreas en las que es deseable la generación de un resultado impredecible. En general, en las aplicaciones en las que la imprevisibilidad es la característica clave, como las aplicaciones de seguridad, se prefieren los generadores de hardware siempre que sea posible.
Los generadores de números pseudoaleatorios son muy útiles en el desarrollo de métodos de simulación Monte Carlo, ya que la depuración se facilita al poder repetir la misma secuencia de números aleatorios al empezar con la misma semilla aleatoria. También se utilizan en criptografía, siempre que la semilla permanezca secreta. El emisor y el receptor pueden generar automáticamente el mismo conjunto de números para utilizarlos como clave.
La generación de números pseudoaleatorios es una tarea importante y habitual en la programación informática. Mientras que la criptografía y ciertos algoritmos numéricos requieren un alto grado de aleatoriedad aparente, muchas otras operaciones requieren sólo un grado modesto de imprevisibilidad. Algunos ejemplos sencillos podrían ser presentar a un usuario una "cita aleatoria del día" o determinar en qué dirección podría moverse un oponente controlado por ordenador en un juego de ordenador. Las formas más débiles de aleatoriedad se utilizan en algoritmos hash y en la creación de algoritmos de búsqueda y ordenación amortizados.
Algunas aplicaciones que a primera vista parecen adecuadas para la aleatorización no son tan sencillas en realidad. Por ejemplo, un sistema que "aleatoriza" pistas musicales para un sistema de música de fondo sólo necesita que aparezcan aleatoriamente y puede incluso tener formas de controlar la selección musical: un sistema verdaderamente aleatorizado no tendría restricciones para que la misma pista apareciera dos o tres veces seguidas.
Números aleatorios reales frente a números pseudoaleatorios ?
La diferencia entre los números reales y los pseudoaleatorios radica en la previsibilidad y el origen de la aleatoriedad.
- Números aleatorios reales: Impredecible, basado en procesos físicos.
- Números pseudoaleatorios: Generados por algoritmos, predecibles si se conoce la semilla.
Existen dos métodos principales para generar números aleatorios. El primer método mide un fenómeno físico que se considera aleatorio y luego compensa las posibles distorsiones en el proceso de medición. Ejemplos de fuentes son la medición del ruido atmosférico, el ruido térmico y otros fenómenos electromagnéticos y mecánicos cuánticos externos. Por ejemplo, la radiación cósmica de fondo o la desintegración radiactiva medida durante cortos periodos de tiempo son fuentes de entropía natural (como medida de la imprevisibilidad o sorpresa del proceso de generación de números).
La velocidad a la que se puede extraer entropía de las fuentes naturales depende de los fenómenos físicos subyacentes que se miden. Por lo tanto, se dice que las fuentes de entropía "verdadera" que se producen de forma natural se bloquean: tienen una tasa limitada hasta que se recoge suficiente entropía para satisfacer la demanda. En algunos sistemas tipo Unix, incluida la mayoría de las distribuciones de Linux, el archivo de pseudodispositivo /dev/random se bloquea hasta que se recoge suficiente entropía del entorno. Debido a este comportamiento de bloqueo, las grandes lecturas masivas de datos de /dev/random, como llenar un disco duro con bits aleatorios, a menudo pueden ser lentas en los sistemas que utilizan este tipo de fuente de entropía.
El segundo método utiliza algoritmos informáticos que pueden generar largas secuencias de resultados aparentemente aleatorios que, de hecho, están completamente determinados por un valor inicial más corto, conocido como valor semilla o clave. Esto permite reproducir toda la secuencia aparentemente aleatoria si se conoce el valor semilla. Este tipo de generador de números aleatorios suele denominarse generador de números pseudoaleatorios. Este tipo de generador no suele ser de bloqueo, por lo que no está limitado por un evento externo, lo que permite la lectura de grandes volúmenes de datos.
Algunos sistemas utilizan un enfoque híbrido que recoge aleatoriedad de fuentes naturales cuando están disponibles y se basa en generadores de números pseudoaleatorios criptográficamente seguros (CSPRNG) que se vuelven a cargar periódicamente cuando la tasa de lectura deseada supera la capacidad del enfoque de recogida natural para satisfacer la demanda. Este enfoque evita el comportamiento de bloqueo de velocidad limitada de los generadores de números aleatorios basados en métodos más lentos y puramente basados en el entorno.
Aunque un generador de números pseudoaleatorios basado únicamente en la lógica determinista nunca puede considerarse una "verdadera" fuente aleatoria en el sentido más puro de la palabra, en la práctica suelen ser suficientes, incluso para aplicaciones exigentes críticas para la seguridad. Los generadores de números pseudoaleatorios cuidadosamente diseñados e implementados pueden certificarse para fines criptográficos críticos para la seguridad, como es el caso de los algoritmos Yarrow y Fortuna. El primero es la base de la fuente de entropía /dev/random en FreeBSD, AIX, macOS, NetBSD y otros. OpenBSD utiliza un algoritmo de números pseudoaleatorios conocido como arc4random.
Métodos de generación
Métodos físicos
Los primeros métodos de generación de números aleatorios, como tiradas de dados, lanzamientos de monedas y ruletas, se siguen utilizando hoy en día, principalmente en juegos y apuestas, ya que son demasiado lentos para la mayoría de aplicaciones en estadística y criptografía.
Un generador físico de números aleatorios puede basarse en un fenómeno físico atómico o subatómico esencialmente aleatorio cuya imprevisibilidad puede atribuirse a las leyes de la mecánica cuántica. Entre las fuentes de entropía se encuentran la desintegración radiactiva, el ruido térmico, el ruido de los disparos, el ruido de avalancha en los diodos Zener, las desviaciones de los relojes, los movimientos temporales del cabezal de lectura de un disco duro y el ruido radioeléctrico. Sin embargo, los fenómenos físicos y las herramientas utilizadas para medirlos suelen presentar asimetrías y distorsiones sistemáticas que hacen que sus resultados no sean uniformemente aleatorios. Un extractor aleatorio, como una función hash criptográfica, puede utilizarse para lograr una distribución uniforme de bits a partir de una fuente no uniformemente aleatoria, pero a una tasa de bits inferior.
En 2013 se desarrolló un prototipo de generador de números aleatorios de alta velocidad en tiempo real basado en un láser caótico.
Se han desarrollado varios métodos inventivos para recoger esta información entrópica. Una técnica consiste en aplicar una función hash a un fotograma de un flujo de vídeo procedente de una fuente impredecible. Lavarand utilizó esta técnica con imágenes procedentes de múltiples lámparas de lava. HotBits midió la desintegración radiactiva con tubos Geiger-Müller, mientras que Random.org registró las fluctuaciones en la amplitud del ruido atmosférico con una radio normal.
Métodos asistidos por ordenador
La mayoría de los números aleatorios generados por ordenadores utilizan PRNG, que son algoritmos que pueden generar automáticamente largas secuencias de números con buenas propiedades de aleatoriedad, pero con el tiempo las secuencias se repiten (o el uso de memoria crece indefinidamente). Estos números aleatorios son suficientes en muchas situaciones, pero no son tan aleatorios como los números generados a partir del ruido electromagnético atmosférico utilizado como fuente de entropía. El conjunto de valores generados por estos algoritmos suele estar determinado por un número fijo llamado semilla. Uno de los PRNG más comunes es el generador de congruencia lineal, que utiliza la relación de recurrencia
Xn+1=(aXn+b)mod mX_{n+1} = (aX_n + b) \mod mXn+1=(aXn+b)modm
se utiliza para generar números donde aaa, bbb y mmm son números enteros grandes, y Xn+1X_{n+1}Xn+1 es el siguiente número de una serie de números pseudoaleatorios. El número máximo de números que puede generar la fórmula es el módulo mmm. La relación de recurrencia puede extenderse a matrices para tener períodos mucho más largos y mejores propiedades estadísticas. Para evitar ciertas propiedades no aleatorias de un único generador de congruencia lineal, se pueden utilizar en paralelo varios generadores de números aleatorios de este tipo con valores ligeramente diferentes del coeficiente multiplicador aaa, con un generador de números aleatorios "maestro" que seleccione entre los diferentes generadores.
Un método sencillo para generar manualmente números aleatorios es el llamado método del cuadrado medio, propuesto por John von Neumann. Aunque es fácil de aplicar, su resultado es de mala calidad. Tiene un periodo muy corto y serias debilidades, como el hecho de que la secuencia de salida casi siempre converge a cero. Una innovación reciente consiste en combinar el método del cuadrado medio con una secuencia de Weyl. Este método produce resultados de gran calidad durante un largo periodo.
La mayoría de los lenguajes de programación contienen funciones o rutinas de biblioteca que proporcionan generadores de números aleatorios. Suelen estar diseñados para proporcionar un byte o palabra aleatoria o un número de coma flotante distribuido uniformemente entre 0 y 1.
La calidad, es decir, la aleatoriedad, de tales funciones de biblioteca varía ampliamente, desde una salida completamente predecible hasta criptográficamente segura. El generador de números aleatorios estándar de muchos lenguajes, como Python, Ruby, R, IDL y PHP, se basa en el algoritmo Mersenne Twister y no es suficiente para fines criptográficos, como se indica explícitamente en la documentación del lenguaje. Estas funciones de biblioteca suelen tener propiedades estadísticas deficientes y algunos patrones se repiten después de sólo decenas de miles de ensayos. A menudo se inicializan con el reloj en tiempo real de un ordenador como semilla, ya que dicho reloj es de 64 bits y mide en nanosegundos, mucho más allá de la precisión de una persona. Estas funciones pueden proporcionar una aleatoriedad suficiente para determinadas tareas (por ejemplo, los videojuegos), pero son inadecuadas cuando se requiere una aleatoriedad de alta calidad, como en aplicaciones criptográficas o estadísticas.
Generadores de números aleatorios de mayor calidad están disponibles en la mayoría de los sistemas operativos; por ejemplo, /dev/random en varios derivados de BSD, Linux, Mac OS X, IRIX y Solaris, o CryptGenRandom para Microsoft Windows. La mayoría de los lenguajes de programación, incluidos los mencionados anteriormente, proporcionan una forma de acceder a estas fuentes de nivel superior.
Generado por personas
La generación de números aleatorios también puede ser llevada a cabo por humanos, recogiendo diversas entradas de los usuarios finales y utilizándolas como fuente de aleatoriedad. Sin embargo, la mayoría de los estudios revelan que los sujetos humanos muestran cierto grado de no aleatoriedad cuando intentan generar una secuencia aleatoria de, por ejemplo, dígitos o letras. Es posible que cambien de elección con demasiada frecuencia en comparación con un buen aleatorizador, por lo que este enfoque no se utiliza mucho. Por la misma razón por la que los humanos no realizan bien esta tarea, la generación humana de números aleatorios puede utilizarse como herramienta para obtener información sobre funciones cerebrales a las que no se puede acceder por otros medios.
Tratamiento posterior y controles estadísticos
Incluso con una fuente de números aleatorios plausible (quizá de un generador de hardware basado en la mecánica cuántica), hay que tener cuidado para obtener números completamente imparciales. El comportamiento de estos generadores suele cambiar con la temperatura, la tensión de alimentación, la antigüedad del dispositivo u otras influencias externas.
Los números aleatorios generados se someten a veces a pruebas estadísticas antes de ser utilizados para garantizar que la fuente subyacente sigue funcionando, y luego se post-procesan para mejorar sus propiedades estadísticas. Un ejemplo sería el generador de números aleatorios por hardware TRNG9803, que utiliza una medición de entropía como prueba de hardware y luego post-procesa la secuencia aleatoria con un cifrado de flujo de registro de desplazamiento. En general, es difícil utilizar pruebas estadísticas para validar los números aleatorios generados. Wang y Nicol propusieron una técnica de prueba estadística basada en la distancia que se utiliza para identificar los puntos débiles de múltiples generadores de números aleatorios. Li y Wang propusieron un método para probar números aleatorios basado en fuentes de entropía caótica láser que utiliza propiedades del movimiento browniano.
También se utilizan pruebas estadísticas para garantizar que el resultado final postprocesado de un generador de números aleatorios es realmente insesgado, y se han desarrollado numerosos paquetes de pruebas de aleatoriedad.
Otras consideraciones
Personalizar la distribución
Distribuciones uniformes
La mayoría de los generadores de números aleatorios trabajan de forma nativa con números enteros o bits simples, por lo que se requiere un paso adicional para lograr la distribución uniforme "canónica" entre 0 y 1. La implementación no es tan trivial como dividir el número entero por su máximo valor posible. Concretamente:
- El entero utilizado en la transformación debe proporcionar suficientes bits para la precisión prevista.
- La propia naturaleza de la aritmética de coma flotante implica que hay más precisión cuanto más se acerca el número a cero. Esta precisión adicional no suele utilizarse debido al gran número de bits necesarios.
- Los errores de redondeo durante la división pueden distorsionar el resultado. En el peor de los casos, una zona supuestamente excluida puede dibujarse con números reales, contrariamente a lo que se espera de las matemáticas.
El algoritmo principal utilizado por OpenJDK, Rust y NumPy se describe en una propuesta para la STL de C++. No utiliza la precisión extra y sólo sufre distorsión en el último bit debido al redondeo al número par más cercano. Otras preocupaciones numéricas son válidas si esta distribución uniforme "canónica" se desplaza a un rango diferente. Un método propuesto para el lenguaje de programación Swift pretende utilizar toda la precisión en todas partes.
Los enteros distribuidos uniformemente se utilizan a menudo en algoritmos como el de Fisher-Yates. De nuevo, una implementación ingenua puede introducir una distorsión de módulo en el resultado, por lo que deben utilizarse algoritmos más elaborados. Un método que casi nunca realiza la división fue descrito por Daniel Lemire en 2018, siendo el estado actual de la técnica el "algoritmo óptimo" inspirado en la codificación aritmética de Stephen Canon de Apple Inc. en 2021.
La mayoría de los RNG de 0 a 1 incluyen el 0 pero excluyen el 1, mientras que otros incluyen o excluyen ambos.
Otras distribuciones
Dada una fuente de números aleatorios distribuidos uniformemente, existen algunos métodos para crear una nueva fuente aleatoria que corresponda a una función de densidad de probabilidad. Un método denominado método de inversión consiste en integrar a un rango que sea mayor o igual que el número aleatorio (que debería generarse entre 0 y 1 para distribuciones adecuadas). Un segundo método, denominado método de aceptación-rechazo, consiste en elegir un valor x y un valor y y comprobar si la función de x es mayor que el valor y. Si es así, la función x es mayor que el valor y. Si es así, se acepta el valor x. En caso contrario, el valor x-w