Comprender la "aleatoriedad"

829

No puedo entender esto, ¿qué es más aleatorio?

rand()

O :

rand() * rand()

Me parece un verdadero desafío para la mente, ¿podrías ayudarme?


EDITAR:

Intuitivamente, sé que la respuesta matemática será que son igualmente aleatorios, pero no puedo evitar pensar que si "ejecutas el algoritmo de números aleatorios" dos veces cuando multiplicas los dos, crearás algo más aleatorio que simplemente hacer una vez

Trufa
fuente
162
¿Qué quieres decir con "más aleatorio"?
dan04
55
Como han dicho otros, estas dos cantidades no tienen la misma distribución. Ver mathworld.wolfram.com/UniformProductDistribution.html para la distribución en realidad estás recibiendo. Compare esto con un solo número aleatorio uniforme, donde todos los valores en el intervalo son igualmente probables, por lo que la función de densidad de probabilidad es una línea recta horizontal.
bnaul
44
Recomiendo leer la estupidez aleatoria en el Daily WTF . Lea especialmente este comentario , donde analizan la salida de este nuevo número aleatorio. El mensaje que debemos sacar de eso es: las operaciones arbitrarias en números aleatorios no necesariamente dan como resultado una salida aleatoria .
detly
51
Además: intuitivamente sé que la respuesta matemática será que son igualmente aleatorios : si pudieras hacer matemáticas solo por intuición, no necesitaríamos todos esos símbolos sangrientos: P
detly
92
No lleve las estadísticas y la intuición a la misma fiesta ...
Dr. belisarius

Respuestas:

1481

Solo una aclaracion

Aunque las respuestas anteriores son correctas siempre que intente detectar la aleatoriedad de una variable pseudoaleatoria o su multiplicación, debe tener en cuenta que si bien Random () generalmente está distribuido de manera uniforme, Random () * Random () no lo está.

Ejemplo

Esta es una muestra de distribución aleatoria uniforme simulada a través de una variable pseudoaleatoria:

Histograma de Aleatorio ()

        BarChart[BinCounts[RandomReal[{0, 1}, 50000], 0.01]]

Si bien esta es la distribución que obtienes después de multiplicar dos variables aleatorias:

Histograma de Aleatorio () * Aleatorio ()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] * 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

Entonces, ambos son "aleatorios", pero su distribución es muy diferente.

Otro ejemplo

Mientras que 2 * Random () se distribuye uniformemente:

Histograma de 2 * Aleatorio ()

        BarChart[BinCounts[2 * RandomReal[{0, 1}, 50000], 0.01]]

Random () + Random () no lo es!

Histograma de Aleatorio () + Aleatorio ()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

El teorema del límite central

El Teorema del límite central establece que la suma de Random () tiende a una distribución normal a medida que aumentan los términos.

Con solo cuatro términos obtienes:

Histograma de Aleatorio () + Aleatorio () + Aleatorio () + Aleatorio ()

BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000] +
                   Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000],
                   {50000}],
         0.01]]  

Y aquí puede ver el camino de una distribución uniforme a una distribución normal sumando 1, 2, 4, 6, 10 y 20 variables aleatorias distribuidas uniformemente:

Histograma de diferentes números de variables aleatorias agregadas

Editar

Unos créditos

Gracias a Thomas Ahle por señalar en los comentarios que las distribuciones de probabilidad que se muestran en las dos últimas imágenes se conocen como la distribución de Irwin-Hall

Gracias a Heike por su maravillosa función [] desgarrada

Dr. belisario
fuente
41
+1. Dado que el OP probablemente quería una distribución uniforme, esta debería ser la respuesta aceptada. Y si lo hiciera rand()+rand(), terminaría con una distribución de tipo "2d6" con un centro de grasa.
Thilo
8
Esto es muy interesante, pero me mata por dentro cuán anti-intuitivo es eso. Daré una mirada más completa después de leer un poco más sobre la distribución. ¡Muchas gracias!
Trufa
46
@Trufa: Quizás esto ayude con parte de la intuición, al menos por sumas. Imagine tomar el "promedio" de un dado lanzado. Ahora imagine tomar el promedio de dos dados. Ahora cien. ¿Qué sucede con la posibilidad de obtener uno o seis para el promedio a medida que agrega más dados?
johncip
3
@matt b Los Gráficos son de una línea en Mathematica. El código es el texto en negrita que precede a cada gráfico. ¡Mathematica es un lenguaje increíble para hacer tramas!
Dr. belisario
44
@thenonhacker: sí, los histogramas demuestran sesgo, pero no demuestran falta de aleatoriedad. Los números aleatorios sesgados no son menos aleatorios. En cuanto a la respuesta correcta a la pregunta original del usuario, "no intentes ser inteligente, solo empeorarás las cosas", y esta respuesta hace que ese punto se transmita.
Kennet Belenky
151

Supongo que ambos métodos son tan aleatorios, aunque mi instinto diría que rand() * rand()es menos aleatorio porque generaría más ceros. Tan pronto como uno rand()es 0, el total se convierte0

Janco
fuente
18
Mi respuesta a todas las respuestas usando esta tira es esta: ¡Me gusta el humor, pero debe ser CW!
Andreas Rejbrand
44
@Andomar: No, no lo es. De ningún modo. ¿Sabes qué es CW?
Andreas Rejbrand
17
@Andreas Rejbrand: CW es un arma que mata preguntas interesantes al negar la reputación a quienes la responden. Parece que se puso nerfed meta.stackexchange.com/questions/392/… (¡quizás por eso surge esta interesante pregunta!)
Andomar
11
@Andomar - Sí, CW mata preguntas interesantes, pero (de las preguntas frecuentes ) "La reputación es una medida aproximada de cuánto confía la comunidad en usted". Si incluye una imagen graciosa con derechos de autor en su respuesta, me hará pensar que su respuesta es genial, y probablemente pensaré que usted también es genial, pero no lo hace más digno de confianza, por lo tanto, idealmente, no hay representante debe ser otorgado Si eso significa CW, o si significa que uno no debería votar la respuesta es otra cuestión.
Richard JP Le Guen
13
el troll "generador aleatorio" en la caricatura podría ser solo un sabio recitando π y llegando al punto de Feynman . por cierto, ¿ son π dígitos aleatorios? :)
mykhal
82

Tampoco es 'más aleatorio'.

rand()genera un conjunto predecible de números basados ​​en una semilla psuedo-aleatoria (generalmente basada en la hora actual, que siempre está cambiando). Multiplicar dos números consecutivos en la secuencia genera una secuencia de números diferente, pero igualmente predecible.

Al abordar si esto reducirá las colisiones, la respuesta es no. Realmente aumentará las colisiones debido al efecto de multiplicar dos números donde 0 < n < 1. El resultado será una fracción más pequeña, causando un sesgo en el resultado hacia el extremo inferior del espectro.

Algunas explicaciones adicionales. A continuación, 'impredecible' y 'aleatorio' se refieren a la capacidad de alguien de adivinar cuál será el próximo número basado en números anteriores, es decir. Un oráculo.

Semilla dada xque genera la siguiente lista de valores:

0.3, 0.6, 0.2, 0.4, 0.8, 0.1, 0.7, 0.3, ...

rand()generará la lista anterior y rand() * rand()generará:

0.18, 0.08, 0.08, 0.21, ...

Ambos métodos siempre producirán la misma lista de números para la misma semilla y, por lo tanto, son igualmente predecibles para un oráculo. Pero si observa los resultados para multiplicar las dos llamadas, verá que están todas a 0.3pesar de una distribución decente en la secuencia original. Los números están sesgados debido al efecto de multiplicar dos fracciones. El número resultante siempre es más pequeño, por lo tanto, es mucho más probable que sea una colisión a pesar de ser igualmente impredecible.

Matthew Scharley
fuente
99
+1 Tenga en cuenta que, por otro lado, se rand()+rand()+rand()...vuelve cada vez "menos aleatorio" (si por azar se refiere a una distribución uniforme).
Thilo
44
@Thilo No, no lo hace ...? Si una variable aleatoria se distribuye uniformemente en el rango (0,1), y muestrea la variable n veces, y toma la suma, se distribuirá uniformemente en el rango (0, n).
user359996
55
@Trufa solo confía rand()en ser realmente aleatorio, y no intentes 'mejorar' su aleatoriedad. No establezca la semilla varias veces. Cualquier semilla individual está perfectamente bien, siempre que sea semi aleatoria. Muchas implementaciones que he visto usan la época UNIX como semilla, que cambia cada segundo y es única cada vez que cambia.
Matthew Scharley
61
@ user359996 rand () + rand () no está distribuido uniformemente. Agregue dos dados, es más probable que obtenga 7 que 2.
Liam
44
@thenonhacker Vea mi definición de aleatoriedad en mi publicación. El hecho de que los valores tiendan hacia un extremo del espectro no aumenta la previsibilidad de los valores exactos producidos, que es a lo que me refería cuando usaba la palabra al azar. Luego pasé a abordar el tema del sesgo por separado.
Matthew Scharley
80

Simplificación excesiva para ilustrar un punto.

Suponga que su función aleatoria solo genera salidas 0o 1.

random()es uno de (0,1), pero random()*random()es uno de(0,0,0,1)

Puede ver claramente que las posibilidades de obtener un 0en el segundo caso no son iguales a las de obtener un 1.


Cuando publiqué esta respuesta por primera vez, quería que fuera lo más breve posible para que una persona que la lea entienda de un vistazo la diferencia entre random()y random()*random(), pero no puedo evitar responder la pregunta original de ad litteram:

¿Cuál es más aleatorio?

Siendo que random(), random()*random(), random()+random(), (random()+1)/2o cualquier otra combinación que no conduce a un resultado fijo tiene la misma fuente de entropía (o el mismo estado inicial en el caso de los generadores pseudoaleatorios), la respuesta sería que son igualmente aleatoria (La diferencia está en su distribución). Un ejemplo perfecto que podemos ver es el juego de Craps. El número que obtienes sería random(1,6)+random(1,6)y todos sabemos que obtener 7 tiene la mayor probabilidad, pero eso no significa que el resultado de tirar dos dados sea más o menos aleatorio que el resultado de tirar uno.

Alin Purcaru
fuente
+1 por condensar algo diabólicamente complicado en "igualmente aleatorio sobre diferentes distribuciones". Muy elegante.
Jens Roland
3
Entonces, técnicamente, (random () * 0 + 9) es igualmente aleatorio, ya que devuelve aleatoriamente un valor del conjunto de 1 elemento: [9]. La caricatura de Dilbert tenía razón.
Jens Roland
2
@Jens Rolan "cualquier otra combinación que no conduzca a un resultado fijo";). 999999 <i> probablemente </i> no se genera aleatoriamente y se puede calcular la posibilidad de que se haya generado aleatoriamente.
Alin Purcaru
69

Aquí hay una respuesta simple. Considera el monopolio. Tira dos dados de seis caras (o 2d6 para aquellos de ustedes que prefieren la notación de juego) y toman su suma. El resultado más común es 7 porque hay 6 formas posibles de sacar un 7 (1,6 2,5 3,4 4,3 5,2 y 6,1). Mientras que un 2 solo se puede lanzar sobre 1,1. Es fácil ver que tirar 2d6 es diferente de tirar 1d12, incluso si el rango es el mismo (ignorando que puedes obtener un 1 en un 1d12, el punto sigue siendo el mismo). Multiplicar sus resultados en lugar de agregarlos los sesgará de manera similar, con la mayoría de sus resultados en el medio del rango. Si está tratando de reducir los valores atípicos, este es un buen método, pero no ayudará a hacer una distribución uniforme.

(Y, por extraño que parezca, aumentará las tiradas bajas también. Suponiendo que su aleatoriedad comienza en 0, verá un pico en 0 porque convertirá lo que sea que haya en la otra tirada en 0. Considere dos números aleatorios entre 0 y 1 (inclusive ) y multiplicar. Si cualquiera de los resultados es un 0, todo se convierte en un 0 sin importar el otro resultado. La única forma de obtener un 1 es que ambas tiradas sean un 1. En la práctica, esto probablemente no importaría pero hace un gráfico extraño).

valadil
fuente
44
"Multiplicar sus resultados en lugar de agregarlos los sesgará de manera similar, con la mayoría de sus resultados en el medio del rango". - verifique esta afirmación con el segundo gráfico en la respuesta de belisario.
Daniel Earwicker
52

El obligatorio xkcd ...
retorno 4;  // elegido por tirada justa de dados, garantizado para ser aleatorio.

3 revoluciones
fuente
77
maldita sea, esto siempre aparece cuando aparece la palabra "al azar" :) ¡¡¡Lo estaba esperando !!
Trufa
99
Me gusta el humor, pero debe ser CW.
Andreas Rejbrand
2
@ Andreas Rejbrand: ¿por qué esta respuesta de "humor" debería ser CW?
warren
16
Si no es CW, la reputación se mostrará en el póster de la respuesta cada vez que se vota (160 rep hasta ahora). Ahora, la reputación es como las calificaciones en la escuela: debe ser un certificado de competencia técnica (en este caso, de programación). Por lo tanto, uno no debería ser capaz de ganar reputación publicando algo que se vota fácilmente pero que no necesita tal dominio. Además, el puntaje de reputación también determina los privilegios del usuario. Por ejemplo, con un puntaje de 10 000, el usuario obtiene acceso a herramientas de moderación en StackOverflow.
Andreas Rejbrand
35

Podría ayudar pensar en esto en números más discretos. Considere la posibilidad de generar números aleatorios entre 1 y 36, por lo que decide que la forma más fácil es lanzar dos dados justos de 6 lados. Obtienes esto:

     1    2    3    4    5    6
  -----------------------------
1|   1    2    3    4    5    6
2|   2    4    6    8   10   12
3|   3    6    9   12   15   18
4|   4    8   12   16   20   24   
5|   5   10   15   20   25   30
6|   6   12   18   24   30   36

Así que tenemos 36 números, pero no todos están representados de manera justa, y algunos no aparecen en absoluto. Los números cerca de la diagonal central (esquina inferior izquierda a esquina superior derecha) aparecerán con la frecuencia más alta.

Los mismos principios que describen la distribución injusta entre los dados se aplican igualmente a los números de coma flotante entre 0.0 y 1.0.

Julieta
fuente
3
+1 para mostrar más concretamente, el cambio en la distribución al multiplicar los números aleatorios. La matriz ayudó más que solo las palabras o incluso un gráfico de distribución.
Marjan Venema
26

Algunas cosas sobre "aleatoriedad" son contra-intuitivas.

Suponiendo una distribución plana de rand(), lo siguiente le dará distribuciones no planas:

  • alto sesgo: sqrt(rand(range^2))
  • sesgo pico en el medio: (rand(range) + rand(range))/2
  • bajo: sesgo: range - sqrt(rand(range^2))

Hay muchas otras formas de crear curvas de sesgo específicas. Hice una prueba rápida de rand() * rand()y te da una distribución muy no lineal.

staticsan
fuente
24

La mayoría de las implementaciones de rand () tienen algún período. Es decir, después de un enorme número de llamadas, la secuencia se repite. La secuencia de salidas de rand() * rand()repeticiones en la mitad del tiempo, por lo que es "menos aleatorio" en ese sentido.

Además, sin una construcción cuidadosa, realizar operaciones aritméticas en valores aleatorios tiende a causar menos aleatoriedad. Un cartel arriba citado " rand()+ rand()+ rand()..." (k veces, por ejemplo) que de hecho tenderá a k veces el valor medio del rango de valores rand()devuelve. (Es una caminata aleatoria con pasos simétricos sobre esa media).

Suponga para la concreción que su función rand () devuelve un número real aleatorio distribuido uniformemente en el rango [0,1). (Sí, este ejemplo permite una precisión infinita. Esto no cambiará el resultado). No eligió un idioma en particular y los diferentes idiomas pueden hacer cosas diferentes, pero el siguiente análisis es válido con modificaciones para cualquier implementación no perversa de rand ( ) El producto rand() * rand()también está en el rango [0,1) pero ya no está distribuido uniformemente. De hecho, es probable que el producto esté en el intervalo [0,1 / 4) como en el intervalo [1 / 4,1). Más multiplicación sesgará el resultado aún más hacia cero. Esto hace que el resultado sea más predecible. A grandes rasgos, más predecible == menos aleatorio.

Casi cualquier secuencia de operaciones en una entrada aleatoria uniforme será aleatoria no uniforme, lo que conducirá a una mayor previsibilidad. Con cuidado, uno puede superar esta propiedad, pero habría sido más fácil generar un número aleatorio distribuido uniformemente en el rango que realmente deseaba en lugar de perder el tiempo con la aritmética.

Eric Towers
fuente
También pensé que pasaría por el período del generador aleatorio dos veces más rápido.
Jared Updike
3
La longitud de la secuencia solo se reducirá a la mitad si es pareja. Si es extraño, obtienes r1 * r2, r3 * r4, ..., rn * r1, r2 * r3, r4 * r5, y la longitud total es la misma.
Jander
23

"aleatorio" versus "más aleatorio" es un poco como preguntar qué cero es más cero.

En este caso, randes un PRNG, por lo que no es totalmente aleatorio. (de hecho, bastante predecible si se conoce la semilla). Multiplicarlo por otro valor no lo hace más o menos aleatorio.

Un verdadero RNG de tipo criptográfico en realidad será aleatorio. Y ejecutar valores a través de cualquier tipo de función no puede agregarle más entropía, y es muy probable que elimine la entropía, por lo que no será más aleatoria.

abelenky
fuente
3
Tenga en cuenta que esto no es cuadratura ya que cada llamada devuelve un valor diferente. Sin embargo, todo lo demás es exacto.
Matthew Scharley
2
@thenonhacker: Por su propia descripción, la secuencia "1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10 , 1,2,3,4,5,6,7,8,9,10 ... "es aleatorio. Se distribuye uniformemente, con todos los números teniendo una oportunidad justa. No hay picos ni sesgos. ¿Realmente consideras esa secuencia aleatoria? Necesitas cambiar tu definición. Aleatorio no se trata de la salida, al azar se trata del proceso utilizado para crear la salida.
abelenky
2
@CurtainDog: la compresión de texto mantiene el nivel de entropía al mismo tiempo que reduce la cantidad de bits necesarios para expresar la misma cantidad de entropía.
Kennet Belenky
44
@thenonhacker, @abelenky: Incluso las distribuciones son fáciles. Lo que importa en un generador de números aleatorios es el número de bits en el estado del generador de números aleatorios. Un generador de números aleatorios de estado cero (por ejemplo, 4, 4, 4, 4, 4, ...) es completamente predecible. Un pad único tiene tanto estado como el número de valores que produce, por lo que es imposible predecirlo. Una convolución de dos PNRG producirá un PNRG con tantos bits de entropía como ambos contengan, menos su covarianza.
Kennet Belenky
1
@ Kennet - Gracias, me has aclarado enormemente eso. @abelenky - genial, te entiendo ahora.
CurtainDog
20

El concepto que está buscando es "entropía", el "grado" de desorden de una cadena de bits. La idea es más fácil de entender en términos del concepto de "máxima entropía".

Una definición aproximada de una cadena de bits con entropía máxima es que no se puede expresar exactamente en términos de una cadena de bits más corta (es decir, utilizando algún algoritmo para expandir la cadena más pequeña de vuelta a la cadena original).

La relevancia de la entropía máxima para la aleatoriedad se deriva del hecho de que si elige un número "al azar", casi con toda seguridad elegirá un número cuya cadena de bits está cerca de tener la entropía máxima, es decir, no se puede comprimir. Esta es nuestra mejor comprensión de lo que caracteriza a un número "aleatorio".

Entonces, si desea hacer un número aleatorio de dos muestras aleatorias que es "dos veces" como aleatorio, concatene las cadenas de dos bits juntas. Prácticamente, simplemente rellena las muestras en las mitades altas y bajas de una palabra de doble longitud.

En una nota más práctica, si te encuentras cargado con un rand horrible (), a veces puede ayudar unir un par de muestras juntas, aunque, si está realmente roto, incluso ese procedimiento no ayudará.

PachydermPuncher
fuente
2
¡Nunca había pensado en las generaciones de números aleatorios a través de xor, pero supongo que puedes llevar el concepto bastante lejos ( en.wikipedia.org/wiki/Mersenne_twister )! Gracias por la respuesta.
Gabriel Mitchell
1
Realmente estoy luchando por asimilar esta respuesta ... ¿No es la entropía máxima derrotada por las respuestas dadas en stackoverflow.com/questions/3956478/understanding-randomness/… y stackoverflow.com/questions/3956478/understanding-randomness/… . En estos casos, el número elegido no se puede comprimir, pero sería difícil llamarlos al azar.
CurtainDog
1
+1 Hermosa como la respuesta aceptada es, esta es mi favorita. Cuando se trata de computadoras, siempre piense en bits, mucho menos confuso y más relevante que tratar de pensar en términos reales. (Escribí mi respuesta y luego noté esta, así que la mía no es más que una expansión de esta, tal vez con un poco de entropía añadida).
Daniel Earwicker
1
El número aleatorio 4o binario de @CurtainDog xkcd 0100se puede comprimir a cero bits. El programa de descompresión simplemente devolvería '4'. No se vuelve menos aleatorio que eso. El problema con dilbert es que no sabemos si podemos comprimirlo a cero bits (descomprimiendo siempre devolviendo 'nueve'). También podría devolver ocho, entonces podríamos comprimir a 1 bit. Descomprimiendo por: 0-> nueve, 1-> ocho. Tendríamos 1 bit aleatorio.
Ishtar
14

La respuesta aceptada es bastante encantadora, pero hay otra forma de responder a su pregunta. La respuesta de PachydermPuncher ya toma este enfoque alternativo, y voy a expandirlo un poco.

La forma más fácil de pensar sobre la teoría de la información es en términos de la unidad de información más pequeña, un solo bit.

En la biblioteca estándar de C, rand()devuelve un número entero en el rango de 0 RAND_MAX, un límite que puede definirse de manera diferente según la plataforma. Supongamos RAND_MAXque se define como 2^n - 1donde nestá algún número entero (este es el caso en la implementación de Microsoft, donde nes 15). Entonces diríamos que una buena implementación devolvería nbits de información.

Imagine que rand()construye números aleatorios lanzando una moneda para encontrar el valor de un bit y luego repitiendo hasta que tenga un lote de 15 bits. Entonces los bits son independientes (el valor de cualquier bit no influye en la probabilidad de que otros bits en el mismo lote tengan un cierto valor). Por lo tanto, cada bit considerado independientemente es como un número aleatorio entre 0 y 1 inclusive, y está "distribuido uniformemente" en ese rango (es probable que sea 0 como 1).

La independencia de los bits garantiza que los números representados por lotes de bits también se distribuyan de manera uniforme en su rango. Esto es intuitivamente obvio: si hay 15 bits, el rango permitido es de cero a 2^15 - 1= 32767. Cada número en ese rango es un patrón único de bits, como:

010110101110010

y si los bits son independientes, entonces no es más probable que ocurra ningún patrón que cualquier otro patrón. Entonces, todos los números posibles en el rango son igualmente probables. Y entonces lo contrario es cierto: si rand()produce enteros distribuidos uniformemente, entonces esos números están hechos de bits independientes.

Por lo tanto, piense rand()en una línea de producción para hacer trozos, que simplemente los sirve en lotes de tamaño arbitrario. Si no le gusta el tamaño, divida los lotes en pedazos individuales y luego vuelva a armarlos en las cantidades que desee (aunque si necesita un rango particular que no sea una potencia de 2, debe reducir sus números , y con mucho, la forma más fácil de hacerlo es convertir a coma flotante).

Volviendo a su sugerencia original, suponga que desea pasar de lotes de 15 a lotes de 30, solicite rand()el primer número, desplace el bit por 15 lugares y luego agregue otro rand(). Esa es una forma de combinar dos llamadas rand()sin perturbar una distribución uniforme. Funciona simplemente porque no hay superposición entre las ubicaciones donde coloca los bits de información.

Esto es muy diferente a "estirar" el rango de rand()multiplicar por una constante. Por ejemplo, si quisieras duplicar el rango rand(), podrías multiplicar por dos, ¡pero ahora solo obtendrías números pares y nunca números impares! Esa no es exactamente una distribución fluida y podría ser un problema grave dependiendo de la aplicación, por ejemplo, un juego similar a la ruleta que supuestamente permite apuestas impares / pares. (Al pensar en términos de bits, evitaría ese error intuitivamente, porque se daría cuenta de que multiplicar por dos es lo mismo que desplazar los bits hacia la izquierda (mayor importancia) por un lugar y completar el espacio con cero. Obviamente, la cantidad de información es la misma, solo se movió un poco).

Dichos espacios en los rangos de números no se pueden agrupar en aplicaciones de números de punto flotante, porque los rangos de punto flotante tienen inherentemente espacios en ellos que simplemente no se pueden representar en absoluto: existe un número infinito de números reales faltantes en el espacio entre cada dos flotantes representables números de puntos! Así que solo tenemos que aprender a vivir con brechas de todos modos.

Como han advertido otros, la intuición es arriesgada en esta área, especialmente porque los matemáticos no pueden resistir el encanto de los números reales, que son cosas terriblemente confusas llenas de infinitos retorcidos y paradojas aparentes.

Pero al menos si lo piensas en términos de bits, tu intuición podría llevarte un poco más lejos. Los bits son realmente fáciles, incluso las computadoras pueden entenderlos.

Daniel Earwicker
fuente
3
+1: En realidad, faltan más números entre dos flotadores de doble precisión IEEE que números en la totalidad de los enteros (matemáticos).
Donal Fellows
13

Como otros han dicho, la respuesta corta y fácil es: No, no es más aleatorio, pero sí cambia la distribución.

Supongamos que estuvieras jugando un juego de dados. Tienes unos dados completamente justos y aleatorios. ¿Serían las tiradas del dado "más aleatorias" si antes de cada tirada de dados, primero colocas dos dados en un tazón, lo agitas, recoges uno de los dados al azar y luego lanzas ese? Claramente no haría ninguna diferencia. Si ambos dados dan números aleatorios, entonces elegir aleatoriamente uno de los dos dados no hará ninguna diferencia. De cualquier manera, obtendrá un número aleatorio entre 1 y 6 con una distribución uniforme en un número suficiente de rollos.

Supongo que en la vida real tal procedimiento podría ser útil si sospechas que los dados NO pueden ser justos. Si, por ejemplo, los dados están ligeramente desequilibrados, entonces uno tiende a dar 1 con más frecuencia que 1/6 de las veces, y otro tiende a dar 6 con una frecuencia inusual, entonces elegir aleatoriamente entre los dos tenderá a ocultar el sesgo. (Aunque en este caso, 1 y 6 aparecerían más de 2, 3, 4 y 5. Bueno, supongo que dependiendo de la naturaleza del desequilibrio).

Hay muchas definiciones de aleatoriedad. Una definición de una serie aleatoria es que es una serie de números producidos por un proceso aleatorio. Según esta definición, si lanzo un dado justo 5 veces y obtengo los números 2, 4, 3, 2, 5, esa es una serie aleatoria. Si luego lanzo el mismo dado justo 5 veces más y obtengo 1, 1, 1, 1, 1, entonces esa también es una serie aleatoria.

Varios carteles han señalado que las funciones aleatorias en una computadora no son realmente aleatorias sino más bien pseudoaleatorias, y que si conoce el algoritmo y la semilla, son completamente predecibles. Esto es cierto, pero la mayoría de las veces es completamente irrelevante. Si barajo una baraja de cartas y luego las doy una a la vez, esta debería ser una serie aleatoria. Si alguien mira las cartas, el resultado será completamente predecible, pero según la mayoría de las definiciones de aleatoriedad, esto no lo hará menos aleatorio. Si la serie pasa pruebas estadísticas de aleatoriedad, el hecho de que haya echado un vistazo a las cartas no cambiará ese hecho. En la práctica, si estamos apostando grandes sumas de dinero por su capacidad de adivinar la próxima carta, entonces el hecho de que haya visto las cartas es muy relevante. Si estamos utilizando la serie para simular las selecciones de menú de los visitantes de nuestro sitio web para probar el rendimiento del sistema, el hecho de que haya observado no hará ninguna diferencia. (Siempre y cuando no modifique el programa para aprovechar este conocimiento).

EDITAR

No creo que pueda responder mi respuesta al problema de Monty Hall en un comentario, así que actualizaré mi respuesta.

Para aquellos que no leyeron el enlace de Belisario, la esencia de esto es: un concursante del programa de juegos tiene la opción de 3 puertas. Detrás de uno hay un premio valioso, detrás de los demás algo sin valor. Él escoge la puerta # 1. Antes de revelar si es un ganador o un perdedor, el anfitrión abre la puerta # 3 para revelar que es un perdedor. Luego le da al concursante la oportunidad de cambiar a la puerta # 2. ¿El concursante debe hacer esto o no?

La respuesta, que ofende la intuición de muchas personas, es que debería cambiar. La probabilidad de que su elección original fuera el ganador es 1/3, de que la otra puerta sea el ganador es 2/3. Mi intuición inicial, junto con la de muchas otras personas, es que no habría ganancia en el cambio, que las probabilidades se han cambiado a 50:50.

Después de todo, suponga que alguien encendió la televisión justo después de que el anfitrión abriera la puerta perdedora. Esa persona vería las dos puertas cerradas restantes. Suponiendo que conoce la naturaleza del juego, diría que hay una probabilidad de 1/2 de que cada puerta oculte el premio. ¿Cómo pueden ser las probabilidades para el espectador 1/2: 1/2 mientras que las probabilidades para el concursante son 1/3: 2/3?

Realmente tuve que pensar en esto para mejorar mi intuición. Para entenderlo, comprenda que cuando hablamos de probabilidades en un problema como este, nos referimos a la probabilidad que asigna dada la información disponible. Para un miembro de la tripulación que dejó atrás el premio, digamos, puerta # 1, la probabilidad de que el premio esté detrás de la puerta # 1 es del 100% y la probabilidad de que esté detrás de cualquiera de las otras dos puertas es cero.

Las probabilidades del miembro de la tripulación son diferentes a las probabilidades del concursante porque él sabe algo que el concursante no sabe, a saber, qué puerta dejó el premio. Del mismo modo, las probabilidades del concursante son diferentes a las probabilidades del espectador porque él sabe algo que el espectador no sabe, a saber, qué puerta eligió inicialmente. Esto no es irrelevante, porque la elección del anfitrión de qué puerta abrir no es aleatoria. No abrirá la puerta que eligió el concursante, y no abrirá la puerta que oculta el premio. Si estas son la misma puerta, eso le deja dos opciones. Si son puertas diferentes, eso deja solo una.

Entonces, ¿cómo se nos ocurre 1/3 y 2/3? Cuando el concursante eligió originalmente una puerta, tenía una probabilidad de 1/3 de elegir al ganador. Creo que eso es obvio. Eso significa que hubo una probabilidad de 2/3 de que una de las otras puertas sea la ganadora. Si el anfitrión del juego le da la oportunidad de cambiar sin dar ninguna información adicional, no habrá ganancia. De nuevo, esto debería ser obvio. Pero una forma de verlo es decir que hay una probabilidad de 2/3 de que gane al cambiar. Pero tiene 2 alternativas. Por lo tanto, cada uno tiene solo 2/3 dividido por 2 = 1/3 de probabilidad de ser el ganador, que no es mejor que su elección original. Por supuesto, ya sabíamos el resultado final, esto simplemente lo calcula de una manera diferente.

Pero ahora el anfitrión revela que una de esas dos opciones no es el ganador. Entonces, de la probabilidad de 2/3 de que una puerta que no eligió sea la ganadora, ahora sabe que 1 de las 2 alternativas no lo es. El otro podría o no ser. Entonces ya no tiene 2/3 dividido por 2. Tiene cero para la puerta abierta y 2/3 para la puerta cerrada.

Arrendajo
fuente
Muy buenas analogías! Supongo que esta es una muy buena explicación en inglés, y a diferencia de muchos otros, realmente respondiste mi pregunta :)
Trufa
@Trufa @Jay La confusión entre el posible preconocimiento de los eventos y la aleatoriedad es MUY común. Permítanme compartir con ustedes esta interesante historia sobre una mujer que resolvió un problema y arrojó un montón de vergüenza a algunos de los mejores matemáticos de la academia. Dijeron muchas cosas de las que lamentarse más tarde (como "Cometiste un error, pero mira el lado positivo. Si todos esos doctorados estuvieran equivocados, el país estaría en serios problemas"). Así que aquí está la historia, relacionada con tus consideraciones ... ¡disfruta! marilynvossavant.com/articles/gameshow.html
Dr. belisario
@belisarius sí. Digo blackjack21 :) es broma, te entiendo!
Trufa
@belisarius BTW nunca consiguió ese, ¡lo intentaré de nuevo ahora!
Trufa
@Trufa Y aquí hay un artículo que muestra la reacción académica a la declaración de Marilyn query.nytimes.com/gst/… (MUY MUY divertido)
Dr. belisarius
11

Considere que tiene un problema simple de lanzamiento de monedas donde incluso se considera cara y lo extraño se considera cruz. La implementación lógica es:

rand() mod 2

En una distribución lo suficientemente grande, el número de números pares debería ser igual al número de números impares.

Ahora considere un pequeño ajuste:

rand() * rand() mod 2

Si uno de los resultados es par, entonces todo el resultado debería ser par. Considere los 4 resultados posibles (par * par = par, par * impar = par, impar * par = par, impar * impar = impar). Ahora, en una distribución lo suficientemente grande, la respuesta debería ser incluso el 75% del tiempo.

Apostaría cara si fuera tú.

Este comentario es realmente más una explicación de por qué no debe implementar una función aleatoria personalizada basada en su método que una discusión sobre las propiedades matemáticas de la aleatoriedad.

usuario479885
fuente
1
¡Tener cuidado! rand()%2puede no ser muy aleatorio; eso realmente depende de la aleatoriedad del bit bajo, y algunos PRNG no son muy buenos de esa manera. (Por supuesto, en algunos idiomas obtienes un resultado de punto flotante, rand()así que no puedes hacerlo de esa manera ...)
Donal Fellows
10

Cuando tenga dudas sobre lo que sucederá con las combinaciones de sus números aleatorios, puede usar las lecciones que aprendió en teoría estadística.

En la situación de OP, quiere saber cuál es el resultado de X * X = X ^ 2, donde X es una variable aleatoria distribuida a lo largo de Uniform [0,1]. Utilizaremos la técnica CDF ya que es solo un mapeo uno a uno.

Como X ~ Uniform [0,1] es cdf es: f X (x) = 1 Queremos la transformación Y <- X ^ 2 por lo tanto y = x ^ 2 Encuentre el inverso x (y): sqrt (y) = x Esto nos da x en función de y. Luego, encuentre la derivada dx / dy: d / dy (sqrt (y)) = 1 / (2 sqrt (y))

La distribución de Y se da como: f Y (y) = f X (x (y)) | dx / dy | = 1 / (2 sqrt (y))

Aún no hemos terminado, tenemos que obtener el dominio de Y. ya que 0 <= x <1, 0 <= x ^ 2 <1 para que Y esté en el rango [0, 1). Si desea verificar si el pdf de Y es realmente un pdf, integrelo sobre el dominio: Integre 1 / (2 sqrt (y)) de 0 a 1 y, de hecho, aparece como 1. Además, observe la forma del dicha función se parece a lo que publicó belisarious.

En cuanto a cosas como X 1 + X 2 + ... + X n , (donde X i ~ Uniform [0,1]) podemos apelar al Teorema del límite central que funciona para cualquier distribución cuyos momentos existan. Es por eso que la prueba Z existe en realidad.

Otras técnicas para determinar el pdf resultante incluyen la transformación jacobiana (que es la versión generalizada de la técnica cdf) y la técnica MGF.

EDITAR: Como aclaración, tenga en cuenta que estoy hablando de la distribución de la transformación resultante y no de su aleatoriedad . Eso es en realidad para una discusión por separado. También lo que realmente obtuve fue para (rand ()) ^ 2. Para rand () * rand () es mucho más complicado, lo que, en cualquier caso, no dará como resultado una distribución uniforme de ningún tipo.

Wil
fuente
9

No es exactamente obvio, pero rand()generalmente es más aleatorio que rand()*rand(). Lo importante es que esto no es realmente muy importante para la mayoría de los usos.

Pero, en primer lugar, producen diferentes distribuciones. Esto no es un problema si eso es lo que quieres, pero sí importa. Si necesita una distribución particular, ignore toda la pregunta "que es más aleatoria". Entonces, ¿por qué es rand()más aleatorio?

El núcleo de por qué rand()es más aleatorio (bajo el supuesto de que está produciendo números aleatorios de punto flotante con el rango [0..1], que es muy común) es que cuando multiplica dos números FP junto con mucha información en la mantisa, obtiene alguna pérdida de información del final; simplemente no hay suficiente bit en un flotante de doble precisión IEEE para contener toda la información que estaba en dos flotadores de doble precisión IEEE seleccionados aleatoriamente de forma uniforme entre [0..1], y esos bits adicionales de información se pierden. Por supuesto, no importa mucho ya que (probablemente) no iba a utilizar esa información, pero la pérdida es real. Tampoco importa qué distribución produce (es decir, qué operación utiliza para hacer la combinación). Cada uno de esos números aleatorios tiene (en el mejor de los casos) 52 bits de información aleatoria, eso '

La mayoría de los usos de números aleatorios no usan ni siquiera tanta aleatoriedad como la que está realmente disponible en la fuente aleatoria. Obtenga un buen PRNG y no se preocupe demasiado por eso. (El nivel de "bondad" depende de lo que esté haciendo con él; debe tener cuidado al hacer la simulación o criptografía de Monte Carlo, pero de lo contrario, probablemente pueda usar el PRNG estándar, ya que generalmente es mucho más rápido).

Compañeros de Donal
fuente
1
Esta respuesta realmente debe leerse junto con la magnífica de belisario; Cubren diferentes aspectos del problema.
Donal Fellows
7

Los randoms flotantes se basan, en general, en un algoritmo que produce un número entero entre cero y un cierto rango. Como tal, al usar rand () * rand (), esencialmente estás diciendo int_rand () * int_rand () / rand_max ^ 2, lo que significa que estás excluyendo cualquier número primo / rand_max ^ 2.

Eso cambia la distribución aleatoria significativamente.

rand () se distribuye uniformemente en la mayoría de los sistemas y es difícil de predecir si se siembra adecuadamente. Úselo a menos que tenga una razón particular para hacer cálculos matemáticos (es decir, moldear la distribución en una curva necesaria).

Fordi
fuente
@belisarius: Ese es solo el caso si 1 es un posible resultado del proceso aleatorio.
Joris Meys
Tuve que leer mucho las respuestas antes de encontrar esta. Indicas un problema claro: el espacio resultante (número de valores posibles) derand()*rand() es menor que el espacio de resultados de rand(), ya que excluye los números primos. Obtiene mi voto ...
Floris
7

Multiplicar números terminaría en un rango de solución más pequeño dependiendo de la arquitectura de su computadora.

Si la pantalla de su computadora muestra 16 dígitos rand(), digamos 0.1234567890123 multiplicado por un segundo rand(), 0.1234567890123, daría 0.0152415 algo que definitivamente encontraría menos soluciones si repitiera el experimento 10 ^ 14 veces.

Huub
fuente
3

La mayoría de estas distribuciones ocurren porque tienes que limitar o normalizar el número aleatorio.

Normalizamos que sea todo positivo, que se ajuste a un rango e incluso que se ajuste a las restricciones del tamaño de la memoria para el tipo de variable asignado.

En otras palabras, debido a que tenemos que limitar la llamada aleatoria entre 0 y X (X es el límite de tamaño de nuestra variable) tendremos un grupo de números "aleatorios" entre 0 y X.

Ahora, cuando agrega el número aleatorio a otro número aleatorio, la suma estará en algún lugar entre 0 y 2X ... esto distorsiona los valores lejos de los puntos de borde (la probabilidad de sumar dos números pequeños y dos números grandes juntos es muy pequeña cuando tienes dos números aleatorios en un amplio rango).

Piense en el caso en el que tuvo un número que es cercano a cero y lo agrega con otro número aleatorio, ciertamente se hará más grande y se alejará de 0 (esto será cierto para los números grandes y es poco probable que tenga dos números grandes (números cercanos a X) devueltos por la función Aleatoria dos veces.

Ahora, si tuviera que configurar el método aleatorio con números negativos y números positivos (que se extienden por igual a través del eje cero), este ya no sería el caso.

Digamos, por ejemplo RandomReal({-x, x}, 50000, .01), que obtendría una distribución pareja de números en el lado negativo y positivo y si tuviera que sumar los números aleatorios juntos mantendrían su "aleatoriedad".

Ahora no estoy seguro de lo que sucedería con el Random() * Random()rango negativo a positivo ... sería un gráfico interesante de ver ... pero tengo que volver a escribir código ahora. :-PAGS

usuario479538
fuente
2
  1. No existe algo más aleatorio. Es aleatorio o no. Aleatorio significa "difícil de predecir". No significa no determinista. Tanto random () como random () * random () son igualmente aleatorios si random () es aleatorio. La distribución es irrelevante en lo que respecta a la aleatoriedad. Si se produce una distribución no uniforme, solo significa que algunos valores son más probables que otros; Todavía son impredecibles.

  2. Como se trata de una pseudoaleatoriedad, los números son muy deterministas. Sin embargo, la seudoaleatoriedad a menudo es suficiente en modelos de probabilidad y simulaciones. Es bien sabido que complicar un generador de números pseudoaleatorios solo dificulta el análisis. Es poco probable que mejore la aleatoriedad; a menudo hace que falle las pruebas estadísticas.

  3. Las propiedades deseadas de los números aleatorios son importantes: la repetibilidad y la reproducibilidad, la aleatoriedad estadística, (generalmente) distribuida uniformemente, y un período grande son algunas.

  4. Con respecto a las transformaciones en números aleatorios: como alguien dijo, la suma de dos o más resultados distribuidos uniformemente en una distribución normal. Este es el teorema del límite central aditivo . Se aplica independientemente de la distribución de origen siempre que todas las distribuciones sean independientes e idénticas. los multiplicativoEl teorema del límite central dice que el producto de dos o más variables aleatorias independientes y distribuidas de forma idéntica es lognormal. El gráfico que otra persona creó parece exponencial, pero es realmente lognormal. Entonces random () * random () se distribuye de manera lognormal (aunque puede que no sea independiente ya que los números se extraen de la misma secuencia). Esto puede ser deseable en algunas aplicaciones. Sin embargo, generalmente es mejor generar un número aleatorio y transformarlo en un número distribuido lognormalmente. Random () * random () puede ser difícil de analizar.

Para obtener más información, consulte mi libro en www.performorama.org. El libro está en construcción, pero el material relevante está allí. Tenga en cuenta que los números de capítulos y secciones pueden cambiar con el tiempo. Capítulo 8 (teoría de la probabilidad) - secciones 8.3.1 y 8.3.3, capítulo 10 (números aleatorios).

Tom
fuente
1

Podemos comparar dos matrices de números con respecto a la aleatoriedad utilizando la complejidad de Kolmogorov. Si la secuencia de números no se puede comprimir, entonces es la más aleatoria que podemos alcanzar a esta longitud ... Sé que este tipo de medición es más teórica opción...

HamoriZ
fuente
1

En realidad, cuando lo piensas, rand() * rand()es menos aleatorio querand() . Este es el por qué.

Esencialmente, hay el mismo número de números impares que números pares. Y diciendo que 0.04325 es impar, y como 0.388 es par, y 0.4 es par, y 0.15 es impar,

Eso significa que rand()tiene la misma probabilidad de ser un decimal par o impar .

Por otro lado, rand() * rand()tiene sus probabilidades apiladas de manera un poco diferente. Digamos:

double a = rand();
double b = rand();
double c = a * b;

ay bambos tienen un 50% de posibilidades de ser pares o impares. Sabiendo que

  • par * par = par
  • par * impar = par
  • impar * impar = impar
  • impar * par = par

significa que hay un 75% de posibilidades de que csea ​​par, mientras que solo un 25% de posibilidades es impar, lo que hace que el valor sea rand() * rand()más predecible que rand(), por lo tanto, menos aleatorio.

John S.
fuente
rand()generalmente da un número entre 0 y 1. ¿Tiene sentido hablar de si es par o impar?
Teepeemm
1
En realidad, lo 0.2*0.2=0.04que sugiere una falla fundamental con este enfoque: multiplicar los 53 bits de dos dobles dará unos 100 bits en el resultado. Pero la última mitad de estos bits se descartarán. Entonces, cuando toma dos dobles con un 1 como su bit menos significativo, no puede decir nada sobre el bit menos significativo de su producto.
Teepeemm
O, para decirlo de otra manera, ha asumido que la definición de "par" y "impar" que tiene sentido para la distribución de rand()es la misma que las definiciones de "par" y "impar" que tienen sentido para la distribución de rand()*rand(). Si ese no es el caso, este argumento falla. Eso es cierto para los enteros, pero estos no son enteros.
David Schwartz
0

Utilice un registro de desplazamiento de retroalimentación lineal (LFSR) que implemente un polinomio primitivo.

El resultado será una secuencia de 2 ^ n números pseudoaleatorios, es decir, ninguno se repetirá en la secuencia donde n es el número de bits en el LFSR ... dando como resultado una distribución uniforme.

http://en.wikipedia.org/wiki/Linear_feedback_shift_register http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf

Use una semilla "aleatoria" basada en microsecs del reloj de su computadora o tal vez un subconjunto del resultado de md5 en algunos datos que cambian continuamente en su sistema de archivos.

Por ejemplo, un LFSR de 32 bits generará 2 ^ 32 números únicos en secuencia (no 2 iguales) comenzando con una semilla dada. La secuencia siempre estará en el mismo orden, pero el punto de partida será diferente (obviamente) para semillas diferentes. Entonces, si una posible secuencia repetitiva entre siembras no es un problema, esta podría ser una buena opción.

He usado LFSR de 128 bits para generar pruebas aleatorias en simuladores de hardware utilizando una semilla que es el resultado de md5 en los datos del sistema que cambian continuamente.

johnny
fuente
0

Suponiendo que rand()devuelve un número entre [0, 1)sí, es obvio que rand() * rand()estará sesgado hacia 0. Esto se debe a que multiplicar xpor un número entre [0, 1)resultará en un número menor que x. Aquí está la distribución de 10000 números aleatorios más :

Si rand()devuelve un entero entre, [x, y]entonces tiene la siguiente distribución. Observe la cantidad de valores pares e impares:

Salman A
fuente
-1

De acuerdo, intentaré agregar algún valor para complementar otras respuestas diciendo que está creando y utilizando un generador de números aleatorios.

Los generadores de números aleatorios son dispositivos (en un sentido muy general) que tienen múltiples características que pueden modificarse para adaptarse a un propósito. Algunos de ellos (de mí) son:

  • Entropía: como en Shannon Entropy
  • Distribución: distribución estadística (poisson, normal, etc.)
  • Tipo: cuál es la fuente de los números (algoritmo, evento natural, combinación de, etc.) y el algoritmo aplicado.
  • Eficiencia: rapidez o complejidad de ejecución.
  • Patrones: periodicidad, secuencias, corridas, etc.
  • y probablemente más ...

En la mayoría de las respuestas aquí, la distribución es el principal punto de interés, pero al mezclar y combinar funciones y parámetros, se crean nuevas formas de generar números aleatorios que tendrán diferentes características para algunas de las cuales la evaluación puede no ser obvia a primera vista.

Loki
fuente
-1

Es fácil demostrar que la suma de los dos números aleatorios no es necesariamente aleatoria. Imagina que tienes un dado de 6 lados y tira. Cada número tiene una probabilidad de 1/6 de aparecer. Ahora digamos que tuvo 2 dados y sumó el resultado. La distribución de esas sumas no es 1/12. ¿Por qué? Porque ciertos números aparecen más que otros. Hay múltiples particiones de ellos. Por ejemplo, el número 2 es la suma de 1 + 1 solamente, pero 7 puede estar formado por 3 + 4 o 4 + 3 o 5 + 2, etc., por lo que tiene una mayor probabilidad de aparecer.

Por lo tanto, la aplicación de una transformación, en este caso, la adición de una función aleatoria no la hace más aleatoria ni necesariamente conserva la aleatoriedad. En el caso de los dados anteriores, la distribución está sesgada a 7 y, por lo tanto, es menos aleatoria.

Sashang
fuente
-1

Como otros ya señalaron, esta pregunta es difícil de responder ya que cada uno de nosotros tiene su propia imagen de aleatoriedad en su cabeza.

Por eso, le recomiendo que se tome un tiempo y lea este sitio para tener una mejor idea de la aleatoriedad:

Para volver a la pregunta real. No hay más o menos al azar en este término:

¡ambos solo aparecen al azar !

En ambos casos, solo rand () o rand () * rand (), la situación es la misma: después de unos pocos miles de millones de números, la secuencia se repetirá (!) . Al observador le parece aleatorio, porque no conoce la secuencia completa, pero la computadora no tiene una fuente aleatoria verdadera , por lo que tampoco puede producir aleatoriedad.

Por ejemplo: ¿El clima es aleatorio? No tenemos suficientes sensores o conocimiento para determinar si el clima es aleatorio o no.

Fabian Bigler
fuente
-2

La respuesta sería que depende, con suerte el rand () * rand () sería más aleatorio que rand (), pero como:

  • ambas respuestas dependen del tamaño de bit de su valor
  • que en la mayoría de los casos se genera en función de un algoritmo pseudoaleatorio (que es principalmente un generador de números que depende del reloj de su computadora, y no demasiado aleatorio).
  • haga que su código sea más legible (y no invoque a algún dios vudú aleatorio aleatorio con este tipo de mantra).

Bueno, si marca cualquiera de estos anteriores, le sugiero que elija el simple "rand ()". Debido a que su código sería más legible (no se preguntaría por qué escribió esto, por ... bueno ... más de 2 segundos), fácil de mantener (si desea reemplazar su función rand con un super_rand).

Si desea un mejor azar, le recomendaría que lo transmita desde cualquier fuente que proporcione suficiente ruido ( radio estático ), y luego un simple rand()debería ser suficiente.

dvhh
fuente