¿Cómo elige una computadora un número al azar?

Si está utilizando una CPU Intel relativamente reciente, lo más probable es que sus números aleatorios en realidad provengan de un pequeño circuito dentro de la CPU cuyo único trabajo es escupir números aleatorios a una velocidad de hasta 6.4 gigabits por segundo.

Algunas de las respuestas aquí mencionan que las computadoras son incapaces de producir números aleatorios verdaderos, y en su lugar deben confiar en una clase de algoritmos matemáticos conocidos como generadores de números pseudoaleatorios. Sin embargo, en los últimos diez años más o menos, los fabricantes de CPU han abordado gradualmente este problema, y ​​la mayoría de los principales fabricantes de CPU de escritorio y servidor ahora han puesto generadores de números aleatorios verdaderos de hardware en sus CPU.

Intel, por ejemplo, el mayor fabricante de CPU de escritorio y servidor del mundo, comenzó a hacer esto en 2012 con Ivy Bridge.

El circuito generador de números aleatorios dentro de las CPU de Ivy Bridge se basa en un circuito de enganche RS-NOR, que utiliza ruido térmico para producir aleatoriedad (ver: ruido Johnson-Nyquist – Wikipedia). Este circuito alimenta un generador de números pseudoaleatorios, que ayuda a normalizar la distribución aleatoria.

(fuente: Comprender el generador de números aleatorios Ivy Bridge de Intel también es un excelente artículo para leer para comprender más sobre las fuentes de entropía).

En pocas palabras, sus números aleatorios pueden provenir de la aleatoriedad causada por la agitación térmica impredecible de los electrones: un circuito inestable se equilibra con mucho cuidado entre dos estados, y una pequeña cantidad de agitación térmica podría causar suficientes electrones adicionales o muy pocos electrones para balancee el circuito hacia un 1 o un 0. Estos 1 y 0 aleatorios se recopilan y se introducen en procesos adicionales (como la generación de un generador de números pseudoaleatorio adicional para producir la distribución numérica correcta y las velocidades de datos que se necesitan). La salida de esto se convierte en la fuente de números aleatorios.

AMD comenzó a agregar una fuente de entropía a su línea de CPU Excavator a partir de 2015. VIA parece haber tenido generadores de números de hardware en su familia C7 ya en 2005 como parte de sus características de criptografía acelerada por hardware VIA Padlock. ARM no produce CPU, pero licencia su diseño a otros fabricantes; no parece haber un generador de aleatoriedad de hardware en los diseños centrales de la CPU, pero varios fabricantes agregan sus propios generadores de números aleatorios de hardware como periféricos a la CPU, ya sea de forma independiente o como parte de funciones criptográficas.

Estos verdaderos generadores de números aleatorios son mejores (léase: más aleatorios) que los generadores de números pseudoaleatorios, pero generalmente no se consideran buenos números aleatorios criptográficamente seguros. Sin embargo, son un paso en la dirección correcta y son perfectamente utilizables para usos no criptográficos de números aleatorios, o en combinación con otras fuentes de entropía, para volverse más aleatorios.

Entonces, en los últimos tiempos, ya no es correcto decir que las computadoras no pueden generar números aleatorios verdaderos, ya que la mayoría de los fabricantes de CPU de escritorio ahora incluyen fuentes de entropía para generar números aleatorios verdaderos.

A2A

Puede obtener verdaderos números aleatorios en hardware.

Resulta que los números verdaderamente aleatorios no son realmente muy útiles. Son útiles para generar nonces al comienzo de los intercambios de claves asimétricas al comienzo de una sesión criptográfica utilizando un intercambio de mochila (ejemplo: criptosistema de mochila Merkle – Hellman).

No son útiles para mucho más, a menos que esté transcribiendo los números para crear una libreta de una sola vez, que planea replicar y distribuir a través de un canal de banda lateral, como una bolsa diplomática llena de DVD.

Por lo tanto, como consecuencia, el verdadero hardware de números aleatorios es relativamente costoso, porque no hay mucha demanda, y debe colocarlo en un dispositivo externo, en lugar de montarlo en la placa de circuito de su computadora.

Si incluye un TPM en su diseño, puede obtener un generador de números aleatorios “verdadero”; si lee la especificación TPM 1.2 (o 2.0) (la que tengo en la copia impresa es 1.2), puede ver que generalmente usan ruido térmico para generar los números aleatorios.

Especificaciones disponibles aquí:

TPM Especificaciones principales | Grupo de informática confiable

Un TPM sería una forma relativamente barata de obtener la fuente de aleatoriedad “verdadera” de un hombre pobre.

Si compró uno de HP, le costará alrededor de $ 99; puede obtener una para las placas base ASUS que ocupan el encabezado DIN por alrededor de $ 20, pero la mayoría de las placas base no ocupan el encabezado DIN o la electrónica de soporte para el encabezado DIN (un par de condensadores, etc.).

Aparte de eso…


La mayoría de las computadoras usan un PRNG – Pseudo Random Number Generator.

Estos son mucho más útiles:

  • Puedes construirlos completamente en software
  • Si le das a uno la misma semilla, generará la misma secuencia nuevamente
  • Es útil para la criptografía.

Estos cumplen con los requisitos de aleatoriedad de la NSA, si se basan en un algoritmo sólido, como el criptosistema de curva elíptica AES ( Advanced Encryption Standard ).


Si desea un generador de números aleatorios, un PRNG es probablemente lo que desea.

Para los juegos, es “lo suficientemente bueno”; y es útil para la criptografía, para algo más que generar valores nonce impredecibles para el apretón de manos inicial.

Los números aleatorios verdaderos requieren una fuente externa de aleatoriedad.

Dentro de la computadora, los números nunca pueden ser verdaderamente aleatorios.

Por lo general, se requiere alguna fuente de aleatoriedad del mundo real (por ejemplo, los bits de orden inferior de la posición del mouse o el número de microsegundos desde el último segundo entero en el reloj de tiempo real).

Esto se puede utilizar para inicializar un “generador de números pseudoaleatorios”, que es una pieza matemática que genera números que saltan por todas partes.

Para simplificarlo, puede hacer esto:

  1. Cuando su programa comienza a ejecutarse, lee el reloj en tiempo real. Dice 17,305 días 11 horas, 20 minutos y 11.534281 segundos desde la medianoche del 1 de enero de 1970.
  2. Tome los últimos tres dígitos del número de ‘segundos’. 281. Esto es realmente impredecible. El milisegundo preciso en el que comenzó a ejecutar el programa es realmente aleatorio … ¿verdad?
  3. Vamos a almacenar, en algún lugar dentro de la computadora, los primeros 1000 dígitos de ‘pi’: 31415 … yadda yadda.
  4. Ahora, usando el número que obtuvimos en el paso (2), tome los dígitos 281 a 284 de PI. Ese es otro número de 3 dígitos que es bastante aleatorio. Supongamos que es 148 … este es nuestro primer número aleatorio.
  5. Para el segundo número aleatorio, utilizamos el número aleatorio anterior para buscar PI, por lo que ahora seleccionamos los dígitos 148 a 151 de pi y los usamos.
  6. La repetición de los pasos (4) y (5) una y otra vez podría ser un generador de números aleatorios razonablemente bueno. No es REALMENTE aleatorio, pero no es terrible.

Desafortunadamente, el uso de “pi” no funcionará; existe un riesgo demasiado grande de que (digamos) los dígitos 100 al 102 puedan ser ‘100’, en cuyo caso, el programa eventualmente se ‘quedaría atascado’ en el número 100 y simplemente generaría una larga cadena del mismo número una y otra vez.

Entonces, en cambio, usamos funciones matemáticas que no tienen esa propiedad. Hay toda una rama de la informática relacionada con la búsqueda de buenas formas de hacerlo.

Pero estos no son números verdaderamente aleatorios.

Para obtener una verdadera aleatoriedad, necesita hardware especializado, algo que se base en la aleatoriedad cuántica o algo así. Estos dispositivos existen, y a menudo se usan para generar una aleatoriedad verdadera donde es de vital importancia tenerlo.

Las computadoras generan números aleatorios para todo, desde criptografía hasta videojuegos y juegos de azar. Hay dos categorías de números aleatorios: números aleatorios “verdaderos” y números pseudoaleatorios, y la diferencia es importante para la seguridad de los sistemas de cifrado.

Generadores de números pseudoaleatorios (PRNG)

Como sugiere la palabra ‘pseudo’, los números pseudoaleatorios no son aleatorios de la manera que cabría esperar, al menos no si estás acostumbrado a tirar dados o boletos de lotería. Esencialmente, los PRNG son algoritmos que usan fórmulas matemáticas o simplemente tablas precalculadas para producir secuencias de números que aparecen al azar. Un buen ejemplo de un PRNG es el método lineal congruencial. Se ha investigado mucho la teoría de números pseudoaleatorios, y los algoritmos modernos para generar números pseudoaleatorios son tan buenos que los números se ven exactamente como si fueran realmente aleatorios.

Cabe señalar que, aunque existen buenos algoritmos PRNG, no siempre se usan, y es fácil obtener sorpresas desagradables. Tomemos el ejemplo del popular lenguaje de programación web PHP. Si usa PHP para GNU / Linux, es probable que esté perfectamente satisfecho con sus números aleatorios. Sin embargo, si usa PHP para Microsoft Windows, probablemente encontrará que sus números aleatorios no están a la altura como se muestra en este análisis visual de 2008. Otro ejemplo data de 2002 cuando un investigador informó que el PRNG en MacOS era no es lo suficientemente bueno para la simulación científica de infecciones por virus. La conclusión es que incluso si un PRNG satisfará las necesidades de su aplicación, aún debe tener cuidado con la que usa.

Generadores de números aleatorios verdaderos (TRNG)

En comparación con los PRNG, los TRNG extraen la aleatoriedad de los fenómenos físicos y la introducen en una computadora. Puedes imaginar esto como un dado conectado a una computadora, pero generalmente las personas usan un fenómeno físico que es más fácil de conectar a una computadora que un dado. El fenómeno físico puede ser muy simple, como las pequeñas variaciones en los movimientos del mouse de alguien o en la cantidad de tiempo entre pulsaciones de teclas. En la práctica, sin embargo, debe tener cuidado con la fuente que elija. Por ejemplo, puede ser complicado usar las pulsaciones de teclas de esta manera, porque las pulsaciones de teclas a menudo se almacenan en el sistema operativo de la computadora, lo que significa que se recopilan varias pulsaciones de teclas antes de enviarlas al programa que las espera. Para un programa que espera las pulsaciones de teclas, parecerá que las teclas se presionaron casi simultáneamente y, después de todo, puede que no haya mucha aleatoriedad.

La respuesta corta es que a menudo se basa en números “pseudoaleatorios”, secuencias que numeran y pasan muchas de las pruebas de aleatoriedad pero que no son realmente aleatorias. Los chips IBM modernos también pueden usar el ruido térmico en el chip como fuente de aleatoriedad. Muchos programadores simplemente usan la rutina rand () en su lenguaje de computadora. Esos son generadores de números pseudoaleatorios y pueden tener limitaciones que los hacen no adecuados para algunos fines para los que desea números aleatorios.

Depende del idioma, pero el que se usa con mayor frecuencia es generado por módulo aritmético (reloj aritmético), una secuencia generada por

[matemáticas] X_ {n + 1} = (a X_ {n} + c) \ mod m [/ matemáticas]

Donde [math] X_ {n} [/ math] es la secuencia de valores pseudoaleatorios

Hay c es el incremento, m el módulo, a el multiplicador y lo siembras con un valor inicial para [math] X_ {0} [/ math]

Normalmente m es una potencia de 2.

Por ejemplo, para ANSI C, entonces m = 2 ^ 31, b = 1103515245, c = 12345 y genera los bits 30 a 16

Aunque pasa muchas pruebas de aleatoriedad, este algoritmo tiene algunos defectos serios que los hacen no adecuados para muchas aplicaciones. Por un lado, la secuencia se repite exactamente con el tiempo (aunque mediante la elección adecuada de los números puede hacer que el período sea alto), y también tiene correlaciones a corto plazo, lo que significa que no es adecuado para las simulaciones de tipo Monte Carlo.

Para obtener más detalles, consulte Generador lineal congruente: Wikipedia y su sección “Ventajas y desventajas”.

Si desea un verdadero número aleatorio, los chips de inteligencia modernos tienen una función para generarlos en el hardware utilizando ruido térmico.

Siempre que verifique que esté funcionando como se espera después de cada llamada y no le proporcione números pseudoaleatorios, esto le da acceso a una aleatoriedad verdadera adecuada incluso para uso criptográfico. Consulte Comprender el generador de números aleatorios Ivy Bridge de Intel

Puede acceder a él utilizando el código de ensamblaje e Intel proporciona algunas rutinas que puede usar para hacerlo siempre que pueda incluir el código de ensamblaje en su aplicación.

Todavía no lo he probado, pero aquí tienen ejemplos de codificación adecuados para la codificación c:

Guía de implementación del software Intel® Digital Random Number Generator (DRNG)

Si desea un número aleatorio criptográficamente seguro, en Windows puede usar CryptGenRandom, que es lo que usan para todas sus rutinas de criptografía. Está sembrado por muchos eventos diferentes en el hardware de la computadora.

Muchos lenguajes de computadora usan el Mersenne Twister, que es mucho mejor.

También puede usar Blum Blum Shub, un algoritmo que se cree que es seguro desde el punto de vista citoptográfico porque resolverlo es equivalente a resolver el problema de la residuo cuadrático que es computacionalmente difícil.

Ver también C / Aleatorización

Ver también la respuesta de Yuan Gao a ¿Cómo una computadora elige aleatoriamente un número?

Usan una función matemática que toma el último número que escupió como su entrada, y genera un número que “parece que no tiene conexión con el último”.

Se llaman generadores de números pseudoaleatorios PRNG

Generador de números pseudoaleatorios – Wikipedia

Los mejores también tienen buenas propiedades estadísticas.

Un ejemplo de algún código para un PRNG (en el ensamblador Z80, tan ilegible) comenzó mi habilidad para escribir juegos en la década de 1980. Así que he hablado sobre esto en una publicación de blog aquí, para aquellos curiosos

https: //www.viewfromthecodeface… .

Los algoritmos de aleatorización pueden basarse en varias cosas, pero el algoritmo de aleatorización más común es en realidad seudoaleatorio o aleatoriedad falsa. Supongamos que desea generar un número aleatorio entre 0 y 100. El algoritmo de aleatorización más básico tomará la cantidad de segundos desde el 1 de enero de 1970 [1] y realizará un módulo en ese número muy grande, garantizando un número aleatorio entre 0 y 100. (El módulo es un operador lógico que tomará el resto de la división entre dos números).

En el momento de esta respuesta, el tiempo de Unix es 1483114356 . Esto generaría el número aleatorio 56.

  1483114356% 100
 56

Si quisiera generar un número aleatorio entre digamos 10 y 100, se aplicaría el mismo concepto, realizaría un operador de módulo, excepto esta vez, usaría 90 (porque esta es la cantidad de valores en el rango especificado), y luego agregue 10 a su resultado, para que se le garantice un resultado entre 10 y 100.

  (1483114356% 90) + 10
 46

Esta no es la cantidad de idiomas principales que se aleatorizan más, pero es una buena manera de comenzar a pensar en cómo se aleatorizan las cosas. Los algoritmos aleatorios toman una semilla (que podría ser el tiempo actual de la CPU, o nanosegundos, o algún otro momento) y luego usan ese número para mirar a través de una tabla con semillas y valores, y devolver el valor asociado con la semilla generada.

Existen algoritmos de clase superior que generarán mejores valores aleatorios, y la aleatoriedad VERDADERA solo puede ocurrir cuando se miden algunos fenómenos naturales, como la desintegración nuclear o el ruido atmosférico. Sin embargo, la mayoría de las veces, es simplemente más fácil y aceptable usar números aleatorios generados por las bibliotecas incluidas en el idioma que está utilizando.

Notas al pie

[1] http: // & nbsp ; https: //en.wikipedia.or

Mira estos números:

  7471
 5742
 15037
 26908
 4235
 12298
 22169
 9016
 17639
 31398

Se ven bastante al azar, ¿verdad? bueno, no hay nada al azar sobre ellos, los generé con este código:

  semilla = 0
 def prng ():
         semilla global
         semilla = (semilla +31) * 241% 32768
         devolver semillas

 para i en rango (10):
         print prng ()

Cada vez que se llama a la función prng, calcula una nueva semilla basada en la fórmula [math] (seed + 31) \ times 241 \ mod 32768 [/ math] y la guarda como la nueva semilla. La semilla también resulta ser el resultado de la función.

¿De dónde obtuve esa función? Literalmente lo inventé solo para esta respuesta, es simplemente una función que salta por todos lados de una manera aparentemente aleatoria. Estos tipos de funciones se denominan generadores de números pseudoaleatorios (PRNG).

Este no es un generador de números aleatorios muy bueno, se puede predecir fácilmente y es totalmente inadecuado para generar contraseñas. Pero para algunas aplicaciones simples como los juegos, incluso esta función es suficiente para crear la ilusión de aleatoriedad. Aquí está la función PRNG utilizada en C #. Es mucho más sofisticado, pero el principio es el mismo, una semilla se mantiene y actualiza cada vez que obtiene el siguiente valor, la función salta por todo el lugar de una manera aparentemente aleatoria.

Para usos más serios, las computadoras recopilarán datos de fuentes externas como la temperatura de la CPU, el tráfico en la red, los golpes del teclado, el tiempo y el ruido del micrófono. Los bits de fuentes externas se denominan entropía. La entropía se usa en la fórmula PRNG para que sea menos predecible.

Los números pseudoaleatorios son generados por algoritmos implementados generalmente por diferentes softwares.

Estos se llaman pseudoaleatorios ( pseudo = false ), porque en realidad no son aleatorios. Toman un valor semilla como entrada y generan tantos números aleatorios como queramos. Si le damos la misma semilla al algoritmo, generará el mismo conjunto de números aleatorios, cuántas veces repetimos. Por lo general, la aleatorización completa depende del valor de semilla individual.

Para lograr una aleatorización verdadera, este valor semilla debe ser aleatorio verdadero, lo que significa que no deben generarse mediante algoritmos, sino que deben ser aleatorios, de modo que nadie lo adivine ni lo reproduzca. Los números aleatorios se utilizan en el cifrado y el hash, por lo que es extremadamente importante que los números aleatorios utilizados sean desconocidos e impredecibles. Entonces, si necesitamos que todos los números aleatorios sean secretos, solo tenemos que asegurarnos de que la semilla sea secreta o no reproducible.

Ahí es donde entra en juego el generador de números aleatorios de hardware. Son los verdaderos generadores de números aleatorios y generalmente se usan para generar esta semilla. Entonces, ¿cómo funciona este hardware? Simplemente captura la aleatoriedad en nuestro entorno, como el ruido térmico, la presión, el viento, etc. Hay muchas cosas que son aleatorias a nuestro alrededor. Podemos capturar uno o muchos de ellos.

Un ejemplo simple sería un circuito que tiene un sensor de temperatura y un sensor de intensidad de luz que mide y digitaliza la temperatura y la intensidad de la luz alrededor del dispositivo en alta resolución y solo las agrega y multiplica. El valor que obtendremos sería altamente impredecible y verdaderamente aleatorio. Este sería un simple generador de números aleatorios de hardware, que puede generar la semilla para algoritmos generadores de números pseudoaleatorios basados ​​en software.

Y así es como su computadora elige un número al azar.

Hay 3 tipos de números aleatorios:

  1. números pseudoaleatorios
  2. número aleatorio criptográfico (o número pseudoaleatorio criptográficamente seguro).
  3. verdadero número aleatorio

La computadora solo puede generar # 1 o # 2.

Los números pseudoaleatorios solo “parecen” números aleatorios. Cuando genera una secuencia de número pseudoaleatorio, parecería que sigue una curva de distribución uniforme. Sin embargo, en realidad, no es aleatorio y sigue una secuencia específica. Suele comenzar con un número de semilla. A partir de ese número inicial, puede predecir (o repetir) la secuencia completa de números generados (a través de una fórmula matemática).

Número aleatorio criptográfico. Todavía es un número seudoaleatorio. Sin embargo, los números específicos generados se consideran mucho más difíciles de predecir, hasta el punto de que el matemático / informático cree que es adecuado para su uso con fines criptográficos. por ejemplo, puede combinar y usar la hora del día, la temperatura de la CPU en ese momento, la frecuencia de la CPU en ese momento, la memoria utilizada en ese momento, la propiedad en tiempo real de la condición de la red o incluso obtener algunos valores de una fuente externa.

Verdadero número aleatorio. En su mayoría, SOLO puedes encontrarlo en la naturaleza. Por ejemplo, las propiedades cuánticas de una desintegración radiactiva de un átomo serían verdaderamente aleatorias. Algún hardware especializado (Hardware Security Module – HSM) podría proporcionar dicha capacidad. O puede obtenerlo del Servicio de números aleatorios verdaderos

También es posible combinar el Servicio de números aleatorios verdaderos y usarlo como una de las semillas para un generador de números aleatorios criptográficos.

Los programas de computadora y las bibliotecas generalmente producen números psuedo-aleatorios . Esta frase no produce mucha confianza … pero recuerde que un algoritmo psuedo-aleatorio decente es prácticamente bueno como algo real (aleatoriedad real) para casi cualquier propósito práctico … como juegos o simulaciones por computadora.

En esencia, hay un proceso de dos partes comúnmente utilizado:

  1. Una semilla de número aleatorio se toma de la hora del sistema, que es una fuente externa. Obtener una semilla de esta manera garantiza que se generen diferentes números cada vez que se ejecuta el programa, porque la hora del sistema siempre está cambiando.
  2. Sin embargo, la hora del sistema cambia de manera predecible. Por lo tanto, es necesario tener un generador de números aleatorios psuedo. El generador realiza una serie de transformaciones matemáticas complejas en el último número de la secuencia y produce uno nuevo.

El efecto combinado es tomar una fuente externa y luego transformarla de tal manera que pequeñas diferencias en el tiempo del sistema den como resultado un número completamente diferente que puede estar en cualquier lugar dentro del rango de valores.

El otro objetivo del generador es transformar los números de tal manera que parezcan ser parte de un patrón aleatorio. Con un buen generador, se generarán números en todo el rango.

El punto importante es que a un humano, al ver un número en la secuencia, le resulta prácticamente imposible predecir el siguiente.

¿Cómo se logra tal transformación? Aquí hay un resumen:

  1. En general, la transformación se basa en algunos números primos grandes, seleccionados en avanzado.
  2. El generador utiliza un algoritmo que se multiplica alternativamente por los números primos y luego realiza una división modular.
  3. El generador también utilizará un algoritmo circular, que volverá a aplicar el valor inicial a intervalos regulares … Esto hace que el algoritmo sea difícil de imposible para realizar ingeniería inversa.

Si se siguen todas estas pautas, el resultado debería ser una secuencia que no sea aleatoria en teoría, pero que tenga todas las características que los humanos esperan ver en secuencias aleatorias de números. Sobre todo, debería ser posible ejecutar pruebas estadísticas en grandes series de estos números y no detectar ningún sesgo obvio.

Mi próximo libro, “Python sin miedo”, presenta una sección completa sobre cómo escribir su propio generador de números aleatorios.

A2A.

A menos que tenga un dispositivo aleatorio verdadero (la mayoría de ellos convierte alguna fuente de calor ruidosa en binario) conectado, no lo tiene.

Algunos sistemas operativos tienen un grupo de entropía que se llena con el mismo ruido aleatorio como el tiempo entre las llamadas del controlador del dispositivo, los movimientos del mouse y otros eventos impredecibles. Esto se puede usar como fuente de números aleatorios. Principalmente como un valor inicial para generadores de números pseudoaleatorios, como tal un grupo de entropía no se llena muy rápidamente.

A2A: Existen algoritmos que pueden generar secuencias de números que son suficientemente aleatorias para la mayoría de los propósitos prácticos. Hay otros algoritmos que pueden usar dichos números para generar otras cosas aleatorias como un shuffle (también conocido como permutación). Ver generador de números pseudoaleatorios – Wikipedia y Fisher-Yates shuffle – Wikipedia.

Como otros han señalado, cualquier cosa elegida por un algoritmo no será verdaderamente aleatoria. Sin embargo, existe una fuente de aleatoriedad verdadera (suponiendo que los humanos no sean deterministas) que esté disponible para cualquier programa interactivo y que no requiera ningún hardware especializado. En lugar de apuntar un contador geiger USB a un poco de material radiactivo, su programa podría obtener la hora actual del sistema cada vez que se presiona una tecla en el teclado de la computadora y usar como un número aleatorio, los menos pocos dígitos significativos del intervalo de tiempo en microsegundos entre pulsaciones de teclas.

El algoritmo más simple posible es así:

semilla = semilla * n1 + n2;

donde n1 y n2 son números primos. Si la semilla es Int16, debe verificar que la semilla llegue al mismo valor después de generar exactamente 65536 valores aleatorios.

float Random () // genera 0… 0.9999999

{

semilla = semilla * n1 + n2;

volver semilla / ((flotante) MAXVALUE (semilla) +1)

}

Si necesita elegir números para una lotería con el posible número 1–49:

para (int i = 0; i <6; i ++) números [i] = (int) (Aleatorio () * 49 + 1)

Hace 30 años también se usaba un código como este para aleatorizar el primer número (casi todos los programas tenían un mensaje “Presione cualquiera para comenzar”:

while (keyNotPressed)

{

Aleatorio()

}

Le hice la misma pregunta a mi profesor de informática en la clase 10 th

Es una función hash que toma la semilla (generalmente el tiempo del sistema) como entrada y devuelve algún valor. Puede usar la aritmética modular para forzarla a estar en cierto rango.

Sí, no es aleatorio, es psuedo aleatorio

Hay diferentes formas, pero podría ser a partir de una semilla fija y las genera a partir de un algoritmo o un dispositivo físico real que utiliza y mide el ruido aleatorio en las cosas.

Generador de números aleatorios de hardware – Wikipedia

Generación de números aleatorios – Wikipedia

Si está hablando de aleatorizar elementos en una lista de reproducción, hay dos formas comunes de hacerlo.

Puede generar un número aleatorio entre 1 y el número de elementos en la lista, luego seleccionar ese elemento de la lista. Esto funciona pero puede terminar reproduciendo la misma pista una y otra vez. ¡La percepción del oyente es que no es al azar en absoluto!

Otra forma es ordenar aleatoriamente la lista, luego reproducirla del primero al último. Esto nunca repite una pista hasta que todos los elementos se hayan reproducido una vez. Esto se percibe como “más aleatorio”, aunque en realidad no lo es. Sin embargo, generalmente es mejor hacerlo de esta manera para mezclar música, si tiene memoria para almacenar y ordenar la lista.

Algunos sistemas muy limitados (como los reproductores de CD) no tienen más remedio que hacerlo de la primera manera, ya que tienen poca o ninguna memoria, al menos los primeros jugadores no.

La mayoría de los generadores de números aleatorios de software son generadores de números pseudoaleatorios.

Usan una semilla, luego usan una función generativa que produce una corriente de números dada la semilla. Por lo general, estas funciones son predecibles dado que sabe en qué estado se encuentra y el valor sembrado.

La forma en que se obtiene la semilla difiere de un generador a otro. Por lo general, intentan maximizar la entropía tomando números de eventos “aleatorios”. Esto incluye: movimiento del mouse, tiempo, bits en un paquete de red, ruido ambiental, intensidad de luz y muchas otras variables de las que puede obtener entropía.

Los generadores de números aleatorios de hardware están diseñados específicamente para este propósito. Generan números que se supone que son impredecibles para su uso en fines criptográficos.

Los generadores de números aleatorios cuánticos usan fenómenos cuánticos para generar estos números. Esto se considera verdadera generación de números aleatorios. Un ejemplo de esto es la medida de la desintegración de un elemento radiactivo. No podemos predecir una vez que un átomo se descompondrá, por lo que medir cuándo una colección de átomos se descompone es una forma bastante buena de obtener datos aleatorios.

Vea la respuesta de Gregory Schoenmakers a ¿Cuáles son buenas maneras de escribir una función que devuelve un valor aleatorio?