Estaba pensando en la función php rand(), y pensando en cómo podría rehacerla, y vine completamente estupido.

¿Cómo funcionan los generadores de números aleatorios?

Comentarios

  • Los generadores de números pseudoaleatorios usan una semilla, una tabla de constantes predefinidas y fórmulas matemáticas. Los generadores de números aleatorios reales suelen utilizar ruido atmosférico. Puede obtener fácilmente números aleatorios al leer / dev / random.
  • ¿Se garantiza que el ruido atmosférico sea aleatorio?
  • random.org tiene un muy buena discusión sobre números aleatorios y cómo ‘ se generan .
  • function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
  • Alguien tiene que hacer esto: xkcd.com/221 😉

Respuesta

Los generadores de números aleatorios (RNG) en realidad están generando números pseudoaleatorios, ya que es imposible generar un número REALMENTE aleatorio. Las únicas cosas realmente aleatorias son los actos de Dios, como un rayo.

Este artículo de wikipedia podría ayudarte con la explicación: http://en.wikipedia.org/wiki/Random_number_generators


Por lo que tengo entendido, hay básicamente dos partes de un RNG: la semilla y luego el número aleatorio elegido de esa semilla. Cuando siembras el RNG, estás dando es un equivalente a un po de partida En t. Ese punto de partida tiene un montón de números que están «dentro» de él y que el programa elige. En PHP, puede usar srand () para «mezclar» las semillas, por lo que casi siempre obtiene una respuesta diferente. Luego puede usar rand (min, max) para ir a la semilla y elegir un número entre el mínimo y el máximo, inclusive.


¡ADVERTENCIA, ANALOGÍA DE QUESO POSIBLE POR ADELANTE!

Piense en cada «semilla» como una hielera, y luego los números aleatorios como cubitos de hielo. Digamos que tienes 1000 hieleras y cada cofre tiene 1000 cubitos de hielo adentro. En la feria del condado, elegirán una hielera para comenzar a usarla para bebidas, y solo pueden usar un cubo de hielo. Sin embargo, solo necesitan cubitos de hielo de más de 1 pulgada cúbica. Así que elegirán un cofre al azar entre esos 1000 cofres, y luego elegirán un cubo de hielo dentro de ese cofre al azar. Si funciona para el tamaño que quieren, lo usan. Si no es así, lo vuelven a poner en el cofre con los demás. Si quieren hacerlo un poco más divertido, cambian los cofres de antemano por un olvido total, ¡por así decirlo!

En cuanto a cómo PHP en realidad elige físicamente la semilla y el número aleatorio, no tengo suficiente conocimiento para eso (¡que es probablemente lo que más te preguntabas!). No intentaría rehacer la función rand (); para la mayoría de las aplicaciones basadas en web que creará, rand () debería ser suficiente para cualquier número aleatorio que necesite.

También revise la congruencia lineal generadores, esto podría ser más de lo que está buscando si quiere los detalles sucios: http://en.wikipedia.org/wiki/Linear_congruential_generator

¡Espero que esto ayude!

Comentarios

  • ¿Cómo serían los actos de god aleatorios en lo más mínimo? Además de eso, el rayo no es ‘ t aleatorio tampoco, sigue un camino determinado por varias condiciones. Además, el intérprete que genera el número es esencialmente irrelevante.
  • Yo ‘ uso los actos de Dios en el sentido legal: en.wikipedia.org/wiki/Act_of_God Se consideran aleatorios ya que están más allá del control humano aparente.
  • Entonces, esencialmente, no hay nada que sea aleatorio. Pero eso requeriría que se influyera en cada ocurrencia aparentemente aleatoria, lo que no ‘ no funciona cuando llegas al comienzo de los tiempos … Parece que yo ‘ voy a tomar algunas clases de filosofía = D
  • @Korvin, hasta donde sabemos, los fenómenos cuánticos como la desintegración radiactiva o la emisión de un fotón por un átomo excitado son genuinamente aleatorios . Sin embargo, los matemáticos y los filósofos discuten qué significa ser genuinamente aleatorio. Y aunque la gente común piensa que lanzar una moneda es bastante aleatorio, los magos de escenario ágiles ( news.stanford.edu/pr/2004/diaconis-69.html ) pueden consigue 10 caras en 10 lanzamientos.
  • @Charles – Un lanzamiento de moneda no es ‘ ni siquiera un cara / cruz binaria, es ‘ s en realidad cara / cruz / borde, por lo que un mago de escenario realmente bueno podría hacer que no salga ni cara ni cruz. * 8 ‘)

Responder

Suelen ser no son verdaderamente aleatorios, sino que se llaman pseudoaleatorios porque generan una secuencia numérica que parece aleatoria. Esto se hace con algunas fórmulas matemáticas interesantes. Una de las más comunes es la Linear Congruential Generador .

Los números pseudoaleatorios tienen una propiedad útil que los números aleatorios verdaderos no tienen: si usas la misma semilla cuando comienzas, obtendrás una secuencia idéntica. Esto puede ser muy útil para las pruebas.

Comentarios

  • Si ‘ entiendo correctamente su segunda declaración: random(5332) siempre será igual a random(5332)?
  • @Korvin, no, quiero decir si llamas a srand(5332) entonces el siguiente número devuelto por rand siempre será el mismo.
  • » aparece aleatorio » – > tienen las mismas propiedades estadísticas que los números verdaderamente aleatorios.
  • +1 para el enlace de Wikipedia de LGC, esto tiene una excelente animación de por qué los PRNGs simples tienen serias limitaciones al realizar simulaciones Monte-carlo multidimansionales.

Respuesta

¿Son y ¿Estás preguntando por pseudoaleatorio o aleatorio? Otros respondieron sobre pseudoaleatorio, permítanme hablar sobre Random.

Había (¿hay?) Generadores de números aleatorios basados en hardware reales a la venta. Se basaron en un chip con una pequeña radio que mide el ruido blanco de la radiación del espacio profundo, o una pequeña muestra radiactiva y mide los períodos entre su desintegración. El problema con ellos era el ancho de banda: la cantidad de entropía que podían generar no era muy alta, por lo que se usaban para semillas de algoritmos pseudoaleatorios. Se usaban en sistemas bancarios, de alta seguridad y similares.

OTOH, si conoces a algún desarrollador de sistemas integrados, se reirán de estos. Para propósitos comunes en la programación de un microcontrolador, leer 4 bits bajos de cualquier convertidor analógico-digital de 16 bits con un pin flotante (desconectado) producirá un resultado perfectamente bueno ruido aleatorio, con un ancho de banda más que suficiente (cuanto más corto es el período de sondeo, más «ruidosa» la lectura), y más fácil que escribir la rutina RNG real. Y considerando que los ADC se encuentran comúnmente implementados en el silicio de microcontroladores, comúnmente implementados y a menudo implementados con 8 canales de los cuales necesita tal vez 5 para su aplicación, es prácticamente gratis.

E incluso si no tiene un ADC, un par de elementos conectados a un pin GPIO digital producirán una muy buena ruido. En el incrustado, el ruido es ev er-present (y luchó constantemente), por lo que obtener algo de aleatoriedad real es muy fácil.

Responder

Hay muchas formas para intentar emular una secuencia de números «aleatoria». Su primera parada debería ser leer acerca de generadores congruentes lineales , seguro. Así es como funcionan la mayoría de los generadores de números aleatorios básicos, y apuesto a que así es como funciona la función rand () de PHP.

La siguiente pregunta más interesante a considerar es ¿cómo se siembra? ? Dirección IP? Etc.

Comentarios

  • La semilla es lo que me confunde, puedo ‘ No piense en nada que pueda posiblemente sembrar la función sin algún tipo de patrón, e incluso si no, ¡entonces qué está causando que se genere la semilla aleatoria en primer lugar!
  • Creo que una marca de tiempo es a menudo se usa como semilla inicial cuando no se proporciona ninguna de otra fuente. En el antiguo BASIC, RANDOMIZE TIMER era un modismo común, y » bueno suficiente » para la mayoría de los propósitos (no criptográficos). Según man 3 srand , la biblioteca GNU C usa semilla fija de 1 hasta que se vuelva a sembrar el PRNG.

Respuesta

En primer lugar, prácticamente todos rand() Las funciones no proporcionan una verdadera aleatoriedad, sino que proporcionan los llamados números pseudoaleatorios.

Entonces, ¿cómo funcionan los generadores de números pseudoaleatorios? Básicamente de la misma manera que funciona el cifrado: tiene una función (un hash) que toma alguna entrada y produce alguna salida de una manera tan compleja que es imposible adivinar la entrada desde la salida o viceversa. Es decir, Cada cifrado se puede utilizar para crear un generador pseudoaleatorio bastante bueno. Sin embargo, aunque podría utilizar cualquier generador pseudoaleatorio para realizar el cifrado en principio, la mayoría de los generadores de números pseudoaleatorios se desarrollan principalmente para la velocidad, no la seguridad criptográfica, por lo que no les dará dolores de cabeza a los hackers.

Para un generador pseudoaleatorio, la función hash se aplica a algún estado interno oculto del generador, y su salida se usa para a) modificar ese estado interno, y b) para calcular la salida de la función rand(). La próxima invocación de rand() usará ese estado interno cambiado y, por lo tanto, producirá un resultado diferente. Cuanto mejor sea la función hash, menos fácilmente se pueden distinguir los resultados de los números aleatorios verdaderos.


De hecho, las computadoras hoy en día tienen acceso a números aleatorios reales: provienen de la fluctuación en el tiempo de las interrupciones producidas por dispositivos externos. Linux usa estos valores de pequeña incertidumbre para agitar constantemente una «reserva de entropía», que es solo unos pocos kilobytes de estado interno. Los hash criptográficos basados en este grupo de entropía están disponibles a través de los dispositivos /dev/random y /dev/urandom. Por lo tanto, acceder a algunos números aleatorios realmente buenos es tan simple como abrir uno de estos dos dispositivos y leer algunos bytes de ellos.

Respuesta

Los números aleatorios son números generados por el proceso cuya salida es impredecible. es decir, no podemos decir cuál será el próximo resultado. Podemos tomar un simple ejemplo de resultado de los dados. Lo que saldrá cuando arrojemos un dado es impredecible.

Hay dos tipos de Número aleatorio 1. Números aleatorios verdaderos 2. Números pseudoaleatorios.

Cómo se generan los números aleatorios

Comentarios

  • Utilice el formato de comillas para resaltar qué partes del las respuestas son suyas y de la fuente que cita. Si toda su respuesta es copiar / pegar de una fuente externa, ‘ no es una buena respuesta aquí.
  • Esto no es ‘ parece ofrecer algo sustancial sobre los puntos planteados y explicados en las 6 respuestas anteriores

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *