Entendiendo la "aleatoriedad"

Resuelto Trufa asked hace 14 años • 28 respuestas

No puedo entender esto, ¿cuál 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 eso una vez.

Trufa avatar Oct 18 '10 10:10 Trufa
Aceptado

solo una aclaracion

Aunque las respuestas anteriores son correctas siempre que intentas detectar la aleatoriedad de una variable pseudoaleatoria o su multiplicación, debes tener en cuenta que, si bien Random() suele estar distribuido uniformemente, Random() * Random() no lo está.

Ejemplo

Se trata de una muestra de distribución aleatoria uniforme simulada mediante una variable pseudoaleatoria:

Histograma de aleatorio()

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

Si bien esta es la distribución que se obtiene 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]]

Aleatorio() + Aleatorio() ¡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í puedes ver el camino desde una distribución uniforme a una normal sumando 1, 2, 4, 6, 10 y 20 variables aleatorias distribuidas uniformemente:

Histograma de diferentes números de variables aleatorias agregadas

Editar

algunos creditos

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 distribución de Irwin-Hall.

Gracias a Heike por su maravillosa función desgarrada.

Dr. belisarius avatar Oct 18 '2010 04:10 Dr. belisarius

Supongo que ambos métodos son igualmente aleatorios, aunque mi intuición diría que rand() * rand()es menos aleatorio porque generaría más ceros. Tan pronto como uno rand()es 0, el total se convierte en0

Janco avatar Oct 18 '2010 20:10 Janco

Ninguno de los dos es "más aleatorio".

rand()genera un conjunto predecible de números basado en una semilla pseudoaleatoria (generalmente basada en la hora actual, que siempre cambia). 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. De hecho, 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, lo que provocará un sesgo en el resultado hacia el extremo inferior del espectro.

Algunas explicaciones adicionales. En lo sucesivo, "impredecible" y "aleatorio" se refieren a la capacidad de alguien de adivinar cuál será el siguiente número basándose 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 de multiplicar las dos llamadas, verá que todas están por debajo 0.3a pesar 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 es siempre menor, por lo que es mucho más probable que se produzca una colisión a pesar de seguir siendo igual de impredecible.

Matthew Scharley avatar Oct 18 '2010 03:10 Matthew Scharley