Tengo un pedazo de código que produce enteros aleatorios.
int c = 250 - (int) floor(rand() * 50);
while (c < 0) {
c = 250 - (int) floor(rand() * 50);
}
El floor()
función devuelve el mayor valor de punto flotante de menos de o igual al argumento y que es igual a un número entero. El rand()
función devuelve los valores de punto flotante dibujado a partir de la distribución normal estándar. Vamos a suponer que tanto funciona como se esperaba y que la pseudo random number generator funciona correctamente, de lo contrario además de la discusión no tendría sentido.
La pregunta es, ¿cuál es la expectativa de los enteros generados por este trozo de código?
Casting el código en términos matemáticos, quiero calcular la esperanza condicional $\mathbb{E}\bigl[250-\lfloor50\cdot Z\rfloor\quad\vert\quad 250-\lfloor50\cdot Z\rfloor\ge0\bigr]$ cuando la variable aleatoria Z es normal estándar distribuido, que es $Z\sim N(0,1)$. La condición se deriva del hecho de que el código anterior arroja números enteros negativos y dibuja de nuevo.
Tenga en cuenta que $\lfloor250 - 50\cdot x\rfloor=250-\lfloor 50\cdot x\rfloor$ mantiene, por lo que la colocación de la función del suelo no debería hacer una diferencia.
La pregunta en este punto es, es este modelo matemático correctamente para describir lo que está pasando en el código? Yo creo que sí, si usted piensa lo contrario, por favor dejar un comentario.
La razón de la transformación lineal $250-50\cdot x$ arriba es simplemente que a través de la rand()
sólo una distribución normal estándar está disponible. Y $X=\mu-\sigma\cdot Z$ sólo se convierte en un $N(0,1)$ distribución en un $N(\mu,\sigma^2)$ distribución, aquí $N(250,50^2)$, por lo que la distribución normal estándar se desplaza a la derecha y ampliado.
Rechazando enteros negativos corresponde a truncar $N(250, 50^2)$ $0$ extracción de la parte inferior de la cola. Descuidar la función del suelo por un momento, mi intuición es, que el truncamiento de la distribución y el necesario reescalar debe mover la media más a la derecha, que es $\mathbb{E}\bigl[X\bigr]>250$ al $X\sim N_{\ge0}(250,50^2)$. De hecho, Mathematica confirma
N[Expectation[x, x \[Distributed] TruncatedDistribution[{0, \[Infinity]},
TransformedDistribution[250 - 50*x, x \[Distributed] NormalDistribution[]]]], 30]
250.000074335997045245285622087
Por la definición de la expectativa de una distribución continua que hemos $$ \mathbb{E}\bigl[250-50\cdot Z \quad \vert \quad 250-50\cdot Z\ge0\bigr]=\mathbb{E}[X]=\int_{-\infty}^\infty x f(x)\;dx $$ con $Z\sim N(0,1)$$X\sim N_{\ge0}(250,50^2)$. El pdf $f(x)$ de la truncada y transformó la distribución normal estándar es $$ f(x)=\frac{g(x)}{1-\Phi\left(\frac{0-250}{50}\right)}\qquad g(x)=\begin{cases}0&x<0\\\phi\left(\frac{x-250}{50}\right)&x\ge0\end{casos} $$ donde $\phi(x)$ $\Phi(x)$ son los pdf y el cdf de la distribución normal estándar. El factor de escala $1-\Phi\left(\frac{0-250}{50}\right)$ es simplemente la probabilidad de masa que queda después de truncamiento. Dividiendo por que se asegura de que tenemos una distribución. Y, de hecho, $$ \int_0^\infty f(x)\;dx=1 $$ se comprueba fácilmente.
Ahora la única manera que conozco de la incorporación de la función del suelo, es por tratarla como lo que es, una función constante a trozos. El siguiente objetivo es convertir esta distribución continua en una función de paso. Cada paso que recoge todos los valores de punto flotante que se asignan por el piso de la función en el mismo entero. Por lo tanto $$ h(a)=\int_a^{+1}f(x)\;dx $$ es la altura del paso a $[a,a+1]$ donde $a\in\mathbb{N_0}$. La comprobación de que la función de paso es una distribución de probabilidad de los rendimientos de $$ \sum_{a=0}^\infty h(a)=1 $$ Ahora el buscado después de la expectativa debe ser simplemente $$ \mathbb{E}\bigl[250-\lfloor50\cdot Z\rfloor \quad \vert \quad 250-\lfloor50\cdot Z\rfloor\ge0\bigr]=\sum_{a=0}^\infty\cdot h(a) $$ Un rápido cálculo con Mathematica evalúa esta suma será
249.5000743384745...
Lo que es desconcertante mí por dos razones.
- Mi intuición es que la media debe desplazar a la derecha, no la izquierda, a pesar de los suelos.
De hecho de ejecutar el código, dejando de producir una muestra de enteros aleatorios de tamaño 317440000 produce una media de
250.507
El cálculo de $h(0)$ $h(250)$ y comparándolos con sus respectivas frecuencias relativas de la muestra de rendimientos $$ \begin{align*} h(0)&=0.0000000312698&h(250)&=0.00797832\\ h(1)&=0.0000000345445&h(251)&=0.00797513\\ \hat{h}(0)&=0.0000000346522&\hat{h}(250)&=0.00796824 \end{align*} $$ Un estadístico puede encontrar que es divertido para probar si la hipótesis de que mis derivación de la expectativa es correcta debe ser rechazado. Para mí esto sugiere un off-by-one de error y resulta que tomando el extremo derecho del paso y sumando $$ \sum_{a=0}^\infty (a+1)\cdot h(a) $$ los rendimientos
250.50007433847...
Suponiendo que Mathematica funciona correctamente y la generación de la muestra y su procesamiento son correctos y que esta derivación realmente describe lo que hace el código, esto sugiere que la he hecho un off-by-one de error. Por desgracia no puedo localizar el error.
Así, las preguntas son:
- Alguien puede identificar un error en el modelado?
- Alguien puede identificar un off-by-one de error?
- Alguien puede localizar otro error?
- Tal vez mi intuición es errónea, una vez más, y alguien puede confirmar la expectativa de $249.5+\epsilon$ por otro método?
- Alguien puede confirmar la expectativa de $250.5+\epsilon$ por otro método?
Por favor, acepte mis disculpas por esta larga publicar, pero no tengo tiempo para escribir uno más corto.