Estoy tratando de escribir una función C ++ que devolverá valores aleatorios gaussianos, dadas sus medias y variaciones.
Hay una función de biblioteca rand()
, que devuelve números aleatorios entre 0
y RAND_MAX
. RAND_MAX
no tiene un valor fijo, pero se garantiza que será al menos . Su PDF es uniforme.
Estoy usando el Teorema del límite central para transformar esto rand()
en una variable gaussiana. Lo que estoy haciendo exactamente es llamar rand()
a un usuario las horas especificadas, luego sumar sus valores de retorno, luego cambiar su media a la media especificada por el usuario.
En el trazado anterior, llamé a mi generador aleatorio gaussiano veces y tracé las frecuencias de sus valores de retorno. Como puede ver, su variación es enorme, ya que se crea mediante la suma de muchos otros valores aleatorios.
Devuelve con éxito una variable gaussiana con un PDF gaussiano y con el valor medio especificado. Sin embargo, el problema es su varianza. Estoy atascado en este punto, porque no sé cómo cambiar su variación al valor especificado por el usuario.
Este es mi código (incompleto por ahora; se ignora el parámetro "Varianza"):
template <class T>
T Random::GetGaussian(T Mean /*= 0*/, T Variance /*= 1*/)
{
T MeanOfSum = NUM_GAUSSIAN_SUMS / static_cast<T>(2);
T Rand = 0;
for (uint64_t i=0; i<NUM_GAUSSIAN_SUMS; i++)
{
Rand += static_cast<T>(rand()) / RAND_MAX;
}
return Rand - (MeanOfSum - Mean);
}
Suponga que NUM_GAUSSIAN_SUMS
es 100 y RAND_MAX
es 32767.
Quiero cambiar la varianza de la variable aleatoria de acuerdo con el parámetro de la función. Mi pregunta es, ¿cómo puedo cambiar la varianza de esta variable aleatoria? ¿Cómo puedo hacerlo?