Estou tentando escrever uma função C ++ que retornará valores aleatórios gaussianos, considerando suas médias e variações.
Existe uma função de biblioteca rand()
, que retorna números aleatórios entre 0
e RAND_MAX
. RAND_MAX
não possui um valor fixo, mas é garantido que será pelo menos . Seu PDF é uniforme.
Estou usando o Teorema do Limite Central para transformar isso rand()
em uma variável gaussiana. O que estou fazendo exatamente é chamar rand()
um horário especificado pelo usuário, somar seus valores de retorno e mudar sua média para a média especificada pelo usuário.
Na plotagem acima, liguei para meu gerador aleatório gaussiano vezes e ploquei as frequências de seus valores de retorno. Como você vê, sua variação é enorme, pois é criada pela soma de muitos outros valores aleatórios.
Ele retorna com êxito uma variável gaussiana com um PDF gaussiano e com o valor médio especificado. No entanto, o problema é sua variação. Estou parado neste momento, porque não sei como alterar sua variação para o valor especificado pelo usuário.
Este é o meu código (incompleto por enquanto; o parâmetro "Variação" é ignorado):
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);
}
Suponha que NUM_GAUSSIAN_SUMS
seja 100 e RAND_MAX
seja 32767.
Eu quero mudar a variação da variável aleatória de acordo com o parâmetro da função. Minha pergunta é: como posso alterar a variação dessa variável aleatória? Como eu posso fazer isso?