Entendiendo la "aleatoriedad"
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.
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:
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:
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:
BarChart[BinCounts[2 * RandomReal[{0, 1}, 50000], 0.01]]
Aleatorio() + Aleatorio() ¡no lo es!
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:
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:
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.
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
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 x
que 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.3
a 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.