Sí. El libro de Mark Joshi es una buena preparación.
Para esta pregunta se le da una función aleatorio() produciendo un número aleatorio uniforme y lo que queremos es una función next() que produce realizaciones de un $X$ variable con valores $v_j$ tal que $P(X=v_j)=p_j$ .
De los libros de texto estándar conocemos la siguiente transformación: Si $u_i$ son números aleatorios uniformes y $g$ la inversa de una función de distribución acumulativa $F$ entonces $g(u_i)$ son realizaciones de una variable aleatoria con f.d.c. $F$ .
En nuestro caso lo mejor es almacenar los valores en un vector $v[]$ así que sólo tenemos que manejar el índice aleatorio $Y$ con $P(Y=j)=p_j$ . La f.d.c. viene dada por $$ F[k] = P(Y\le k) = \sum_{j \le k} p_j $$ y se puede almacenar en otra matriz, Ahora la inversa es fácil de implementar:
int g(double x)
{
for (int k = 0; k < F.Length; k++)
{
if (x <= F[k])
return k;
}
return F.Length - 1; // you're not getting here
}
y
double next()
{
return v[g[random()]];
}
Hecho. La transformada también puede usarse para generar números aleatorios normales, exponenciales...
3 votos
Me pregunto si @MarkJoshi intervendrá...
0 votos
Además, calcula la probabilidad de que tu futuro empleador esté leyendo este post. ;)
0 votos
@vanguard2k jaja no me asustes así