Este es un ejemplo "de juguete" porque es más fácil y mejor hacer integración numérica, más o menos como la que se utiliza para hacer tablas normales impresas, para obtener la respuesta correcta. Sin embargo, es un buen ejemplo sencillo para familiarizarse con el muestreo de aceptación.
Integración numérica (sin simulación). Así que al principio, vamos a encontrar la respuesta correcta a su problema con integración numérica. En el software estadístico R, esto se puede hacer como sigue:
integrand = function(x){x*dnorm(x)/diff(pnorm(c(0,1)))}
# 'dnorm' is std normal PDF; 'pnorm' is std normal CDF
integrate(integrand, 0, 1)
0.4598622 with absolute error < 5.1e-15
Mi "función" es $xK\varphi(x),$ donde $1/K = \int_0^1 \varphi(x)\,dx$ et $\varphi$ denota la densidad normal estándar. Así, para $X$ distribuido según su distribución normal truncada con la negación $\varphi^*(x),$ para $x \in (0,1)$ et $0$ de lo contrario, tenemos $E(X) = \int_0^1 x\varphi^*(s)\,dx \approx 0.4599.$ [Comprobación de la realidad: Un boceto debería convencerte de que la respuesta debe estar en $(0,1)$ y ligeramente por debajo de $1/2.$ ]
Simulación de fuerza bruta. En R, el método de simulación de "fuerza bruta" que mencionas equivale a lo siguiente:
x = rnorm(10^6) #'rnorm' samples from std normal
mean(x[x > 0 & x < 1])
## 0.4598828
Este es un método ineficiente porque estamos promediando sólo sobre menos de 341.000 de los un millón de valores muestreados de x
. (Esta ineficacia debe es de prever, ya que $1/K = P(0 < Z < 1) = .3413,$ donde $Z \sim \mathsf{Norm}(0,1).$ ) Obtuve una buena respuesta porque utilicé un millón de iteraciones, lo que habría sido una extravagancia impensable hace sólo unos años.
sum(x > 0 & x < 1)
## 340532
Muestreo de importancia. En respuesta a una de sus preguntas: $g(x) = 1,$ para $x \in (0,1)$ porque que es el PDF de $\textsf{Unif}(0,1).$
Ahora, considere la ecuación $$\int_0^1 xf(x)\,dx = \int_0^1 x\frac{f(x)}{g(x)}g(x)\,dx = \int_0^1 xw(x)g(x)\,dx = \int_0^1 xw(x)\,dx,$$ donde $w(x) = f(x)/g(x).$ Aquí $f(x) = \varphi^*(x)$ arriba. El código R para la media deseada a continuación utiliza todo el millón de valores muestreados de $\mathsf{Unif}(0,1).$
K = 1/diff(pnorm(c(0,1)))
u = runif(10^6)
K*mean(u*dnorm(u))
## 0.4599921