¿Cómo generar números aleatorios reales? He estado jugando con la función rand () en C ++. Leí de varias fuentes en línea que los generadores de números aleatorios que vienen con el paquete son bastante básicos. Hay alguna manera de corregir esto

Los generadores de números aleatorios pueden ser de los siguientes dos tipos:

  • Generador de números pseudoaleatorios (PRNG)
  • Generador de números aleatorios verdaderos (TRNG)

El generador de números pseudoaleatorios o llamado Generador determinista de números aleatorios (DRNG) son algoritmos computacionales que producen una secuencia de números basada en un estado inicial arbitrario llamado ESTADO DE LA SEMILLA , es decir, si [math] {x} _ {0} [/ math ] se elige de alguna manera al azar, luego [matemáticas] {x} _ {n} = f ({x} _ {m}) [/ matemáticas]. Por lo tanto, un generador de números pseudoaleatorios es determinista y los números sucesivos de la secuencia se pueden determinar con conocimiento de las salidas anteriores si hay suficiente potencia computacional. Por lo tanto, ningún algoritmo computacional o funciones como rand () pueden darle una secuencia que sea verdaderamente aleatoria. Debido a la naturaleza determinista de los números pseudoaleatorios, plantea serias amenazas a muchos problemas relacionados con la privacidad y la integridad en los sistemas de comunicación y encriptaciones.

Por otro lado, los verdaderos generadores de números aleatorios dan una secuencia de números verdaderamente aleatorios. Tales secuencias nunca pueden derivarse de algoritmos computacionales. Utilizan la aleatoriedad inherente y el caos en varios fenómenos físicos y cuánticos para producir la secuencia de números aleatorios. Entonces, para obtener una secuencia de números aleatorios verdaderos, uno necesita explotar la aleatoriedad física del universo. Nunca se puede lograr con ningún algoritmo. Sin embargo, para fines prácticos, son suficientes los algoritmos de números pseudoaleatorios muy fuertes con una cantidad muy baja de correlación entre los miembros de la secuencia. Pero eso simplemente no los hace verdaderamente al azar.

Según Jon von Neumann, quien fue la primera persona en señalar la incapacidad de los algoritmos computacionales para generar números verdaderamente aleatorios:

“Cualquier persona que intente producir números aleatorios por medios puramente aritméticos está, por supuesto, en un estado de pecado”.

No es un problema fácil de resolver. Generar números aleatorios en un programa es complejo y no se garantiza que genere aleatoriedad. Depende de lo que intentes lograr. Si es una necesidad absoluta para usted generar un número aleatorio, entonces necesitaría obtener un hardware para generarlos por usted (al menos generar una semilla y luego puede aleatorizar aún más). Veamos formas de generar aleatoriedad.

  1. Hardware: un tipo de chip que puede agregar a su computadora para generar números aleatorios. Esto genera un verdadero número aleatorio.
  2. Programa del sistema operativo: Unix / Linux e incluso Windows proporcionan programas a nivel del sistema operativo para generar números aleatorios. Por lo general, / dev / random en * ix y Win C API CryptGenRandom en Windows. Esto puede no generar un verdadero azar pero sería lo suficientemente cerca.
  3. Función de semilla a rand: en C ++ hay un método srand, puede pasarle tiempo y puede tener suerte de ver buenos resultados.
  4. bibliotecas de código abierto: hay muchas. Descarga uno y prueba.
  5. SecureRandom en java: si te gusta java, usa esta clase y podrás generar un número aleatorio a nivel del sistema operativo.

Para generar números aleatorios reales, números aleatorios que cambian con el tiempo, uno debe cambiar la semilla de la función rand (). Los números aleatorios se generan usando un número base, que se llama semilla. Ahora, si desea cambiar la semilla cada vez ejecuta el programa, luego debe usar el tiempo de su computadora como semilla, ya que esto es lo único que cambia con el tiempo.Ahora para usar el tiempo como semilla, escriba
relleno vacío al azar (int a [], int n) {
t largo;
int i;
t = tiempo (NULL);
srand (t);
para (i = 0; i a [i] = rand ();
}
Esta es una función que generará una matriz que contiene n números de números aleatorios.

La generación de pseudoaleatoriedad siempre es reversible en el sentido de que puede encontrar cuál era el programa de computadora que generaba la salida pseudoaleatoria, y así reproducirla. Algo que puedes reproducir a voluntad no es aleatorio. Eso ni siquiera significa que encontrará la condición inicial correspondiente (es decir, la versión descifrada) que conduce a la salida (por ejemplo, un mensaje cifrado), ya que el generador pseudoaleatorio puede no ser una función uno a uno, o puede ser imposible en la práctica debido a limitaciones de tiempo (por ejemplo, las llamadas funciones unidireccionales, por ejemplo, basadas en la dificultad de la factorización prima).

Por lo tanto, la pseudoaleatoriedad es solo otro nombre para la no aleatoriedad (es decir, el determinismo), pero es el tipo de no aleatoriedad que parece ser aleatorio en la superficie, por lo tanto, es aleatoriedad estadística (que es muy diferente de la aleatoriedad verdadera, por ejemplo, aleatoriedad algorítmica no controlable , es decir, el tipo de aleatoriedad que es imposible de generar por medios mecánicos finitos).

La pregunta es si existe una aleatoriedad verdadera, la mecánica clásica dice que no, porque todo debe tener una causa. Solo los eventos no causados ​​pueden ser aleatorios y esos procesos no existen en la mecánica clásica. Incluso suponiendo que las fluctuaciones cuánticas pueden ser verdaderamente aleatorias, no está claro cómo se pueden propagar a la realidad de grano grueso en la que vivimos. Y mucho menos si la aleatoriedad cuántica es realmente aleatoria algorítmica, ya que solo es aleatoria bajo algunas interpretaciones de la mecánica cuántica, pero no es realmente necesaria en la teoría (la matemática se trata solo de probabilidades, no de requerir una aleatoriedad incontestable).

Los generadores de números aleatorios provistos en lenguajes de programación generalmente se basan en matemáticas, pero si se siembran adecuadamente generarán valores que tienen una distribución estadísticamente uniforme.

Es probable que obtenga el mismo resultado en cada inicio porque no lo siembra.

Ver srand – Referencia de C ++

se generaban los mismos números cada vez que ejecutaba el programa

Parece que no sembró su generador de números pseudoaleatorio. para std :: rand, la función semilla es std :: srand, aunque los detalles de la pregunta mencionan C ++, y usar std :: rand en C ++ es una mala idea por otras razones, use los generadores de (vea ejemplos en esa referencia para saber cómo sembrarlos, por ejemplo, std :: uniform_int_distribution)

Si está buscando específicamente números aleatorios no deterministas, C ++ proporciona acceso a ellos a través de std :: random_device (famoso no implementado en MinGW); cuando se implementa, esto accede al grupo de entropía del núcleo de la CPU o del sistema operativo. También hay bibliotecas y hardware adicional para números aleatorios no deterministas de mayor calidad, pero no necesita nada de eso para su juego de adivinanzas. Solo siembra el generador.