javascript math random statistics

Pregunta sobre JavaScript Math.random()y lógica básica



statistics (5)

(De hecho, no está viendo las diferencias , sino las diferencias absolutas entre sus números aleatorios. Hay una diferencia. (Perdone el juego de palabras.))

Si tiene dos variables aleatorias independientes distribuidas uniformemente X, Y ~ U[0,1] , entonces su diferencia absoluta |XY| Seguirá una distribución triangular con expectativa de 1/3. Todo es como debe ser. Este resultado distributivo, así como el cálculo de la expectativa, es un problema de tarea bastante estándar en la teoría de la probabilidad. La intuición sigue directamente el argumento de Marcos .

Aquí están los histogramas de las diferencias absolutas y no absolutas. A la izquierda, se ve cómo hay más masa para diferencias absolutas más pequeñas, lo que hace que la expectativa disminuya.

Código R:

set.seed(1) xx <- runif(1e5) yy <- runif(1e5) par(mfrow=c(1,2)) hist(abs(xx-yy),main="|X-Y|",col="grey",xlab="") hist(xx-yy,main="X-Y",col="grey",xlab="")

(Por cierto, nuestro sitio hermano CrossValidated es un recurso maravilloso si tiene una pregunta de probabilidad / estadísticas).

Escribí un simple fragmento de código para comparar la diferencia de matrices aleatorias y encontré algo ... que no entiendo muy bien.

  1. Genero 2 matrices llenas de números aleatorios.
  2. Sume las diferencias entre los números aleatorios.
  3. Imprime la diferencia promedio

Habría esperado que el resultado fuera un número aleatorio cercano a 0.5 pero en la práctica es 0.3333.

¿Por qué la matriz de números aleatorios encaja en 0.3 y no 0.5?

const result = document.getElementById(''result''); const generateRandomNrArray = (nrNumbers) => { let i; let result = []; for (i = 0; i < nrNumbers; i++) { result.push(Math.random()); } return result; } const getArrayDiff = (arr1, arr2) => { var diff = 0; arr1.forEach(function (v1, index) { diff += Math.abs(v1 - arr2[index]); }); return diff; } const run = (nr) => { const arr1 = generateRandomNrArray(nr); const arr2 = generateRandomNrArray(nr); const totalDiff = getArrayDiff(arr1, arr2); result.innerHTML = "Average difference:" + (totalDiff / nr); }

button {font-size: 2em;}

<div id="result"></div> <button id="run" onclick="run(1500)">Click Me</button>


Aquí hay un argumento geométrico para demostrar por qué el resultado converge a 1/3.

Primero, definamos f (x, y) = abs (x - y). Lo que necesitamos probar es que, para X e Y como dos variables aleatorias independientes con distribución uniforme en [0, 1], E (X, Y) = 1/3.

Si visualizamos la función f en 3D, como un campo de altura sobre el cuadrado [0, 1] x [0, 1], el volumen debajo de f consiste en dos tetraedros cuya base es un cuadrado de media unidad, y cuya altura es un unidad alta.

E (X, Y) es el volumen bajo f. Por la fórmula del volumen de la pirámide, cada uno de los dos tetraedros tiene el volumen a * h / 3, donde a es su área base y h su altura. Eso significa que cada tetraedro tiene un volumen 1/2 * 1 * 1/3 = 1/6, y por lo tanto E (X, Y) = 2 * 1/6 = 1/3.


Esto básicamente se reduce a un límite y tiene sentido. Considera las combinaciones de números entre 0 y 10 y cuenta las distintas diferencias que puedes hacer.

Por ejemplo, hay una combinación con una diferencia de 9 - (0, 9). Hay 5 con una diferencia de 5:

[0, 5], [1, 6], [2, 7], [3, 8], [4, 9]

Pero hay nueve combinaciones con una diferencia de 1:

[1, 2], [2, 3], ... [8, 9]

Con 0 - 10 las cuentas son:

{1: 9, 2: 8, 3: 7, 4: 6, 5: 5, 6: 4, 7: 3, 8: 2, 9: 1}

Hay 45 combinaciones y la diferencia promedio de esas combinaciones es 3.6666 no 5 porque hay diferencias más pequeñas que las más grandes.

Cuando aumenta la granularidad de 0-10 a 0-10, se mantiene el mismo patrón. Hay 99 combinaciones que resultan en una diferencia 1 y solo 50 con una diferencia de 50 para un promedio de 33.6666 .

A medida que aumenta el número de dígitos significativos en las direcciones opuestas en la dirección opuesta con divisiones más finas entre 0 y 1, encontrará el mismo proceso a medida que el límite se acerca a 1/3 . Hay muchas más diferencias menores que las más grandes que reducen la diferencia promedio. Para intervalos de 0-1 en 0.1 verá 9 con una diferencia de 0.1 y 5 con una diferencia de 0.5, a 0.01 habrá 99 con una diferencia de 0.01 y 50 con una diferencia de 0.5. A medida que el intervalo se acerca a 0, el promedio de las diferencias se acerca a 1/3 .


Hay una manera natural fácil de ver esto:

Si tiene un intervalo, digamos <0.0, 1.0> y elige aleatoriamente un número del intervalo, esencialmente dividirá el intervalo en dos partes <0.0, x> y <x, 1.0> . El tamaño promedio de cada parte (sobre muchos números aleatorios) convergerá a 0.5 .

Ahora, si elige dos números aleatorios del intervalo, está dividiendo el intervalo en tres partes <0.0, x> , <x, y> y <y, 1.0> ( x < y ). Si calcula el tamaño promedio de cada parte sobre muchos números aleatorios, convergerá a 1/3 .

La diferencia promedio entre los dos números es el tamaño promedio de la parte.

(originalmente un comentario)


con enfoque variable discreta

intervalo de subdivisión [0; 1] en N elems (resp k = 1 a N, X tomará el valor k/N ). Más adelante haremos que N tiende a infty.

Para X_k dado (donde X tiene el valor k/N ), calcular la distancia promedio, dada por

avgDistance(k) = sum_{i=1}^k (k-i)/N P(Y=i) + sum_{i=k+1}^n (i-k)/N P(Y=i)

primer término cuando y <x, segundo término cuando x <y

el primer término suma la distancia entre 0 y k, por lo que 1/N(k(k+1)/2) , mientras que el segundo término suma la distancia entre 1 y Nk, por lo que 1/N(Nk)(N-k+1) . Además, P(Y=i) = 1/N para todo i (ya que Y se distribuye uniformemente)

así

avgDistance(k) = 1/N^2 [ k(k+1)/2 + (N-k)(N-k+1)/2 ] = 1/(2N^2) [ 2k^2 + N^2 - 2kN + N ]

Finalmente

avgDistance = sum_{k=1}^N avgDistance(k) P(X=k) = 1/N sum_{k=1}^N avgDistance(k) = 1/(2N^3) sum [ 2k^2 + N^2 - 2kN + N ]

La idea es simplificar la suma como aN ^ 3 + ... términos menos que N ^ 3, por lo tanto, cuando N tiende a inflar, simplemente obtendremos un N ^ 3 / (2N ^ 3) + algo que tiende a 0

sum 2k^2 = 2(N(N+1)(2N+1))/6 ~ 4N^3/6 sum N^2 = N^3 sum -2kN = -2N(N(N+1)/2 ~= -N^3

Así, a = 4/6 y avgDistance = 1/3