J'essaie d'écrire une fonction C ++ qui renverra des valeurs aléatoires gaussiennes, compte tenu de leurs moyennes et de leurs variances.
Il existe une fonction de bibliothèque rand()
, qui renvoie des nombres aléatoires entre 0
et RAND_MAX
. RAND_MAX
n'a pas de valeur fixe, mais il est garanti qu'elle sera d'au moins . Son PDF est uniforme.
J'utilise le théorème de limite centrale pour transformer cela rand()
en une variable gaussienne. Ce que je fais exactement, c'est appeler rand()
un temps spécifié par un utilisateur, puis additionner ses valeurs de retour, puis déplacer sa moyenne vers la moyenne spécifiée par l'utilisateur.
Dans le tracé ci-dessus, j'ai appelé mon générateur aléatoire gaussien pour fois, et tracé les fréquences de ses valeurs de retour. Comme vous le voyez, sa variance est énorme, car elle est créée par la somme de beaucoup d'autres valeurs aléatoires.
Il renvoie avec succès une variable gaussienne avec un PDF gaussien et avec la valeur moyenne spécifiée. Cependant, le problème est sa variance. Je suis bloqué à ce stade, car je ne sais pas comment modifier sa variance à la valeur spécifiée par l'utilisateur.
Voici mon code (incomplet pour l'instant; le paramètre "Variance" est ignoré):
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);
}
Supposons que ce NUM_GAUSSIAN_SUMS
soit 100 et RAND_MAX
32767.
Je veux changer la variance de la variable aléatoire en fonction du paramètre de la fonction. Ma question est, comment puis-je changer la variance de cette variable aléatoire? Comment puis-je le faire?
Réponses:
Votre algorithme initial crée une variable aléatoire qui est uniformément répartie entre 0 et 1. La variance de cela est 1/12. Si vous en additionnez des
NUM_GAUSSIAN_SUMS
instances, la variance seraNUM_GAUSSIAN_SUMS/12
. Pour arriver à une variance cibleV
, vous devez multiplier la variable aléatoire additionnée parsqrt(V*12/NUM_GAUSSIAN_SUMS)
.En remarque, un modèle fonctionnera assez bien pour les flottants et les doubles, mais il y aura des problèmes numériques importants avec tout type de point fixe.
la source
la source
Il y a encore une autre façon!
Pensez-y, et si vous vouliez une autre distribution par opposition à la gaussienne? Dans ce cas, vous ne pouviez pas vraiment utiliser le théorème de la limite centrale; comment le résolvez-vous alors?
Il existe un moyen de convertir une variable aléatoire uniforme en PDF arbitraire. Cette méthode est appelée méthode de transformation inverse
Par conséquent, tout ce que vous devez faire est d'appliquer la fonction CDF inverse à la variable que vous avez récupérée à partir de l'échantillon du RV uniforme.
De plus, contrairement aux méthodes précédentes - cela ne nécessitera aucune itération et ne dépendra pas du nombre d'itérations qui seront prises pour rendre les résultats plus proches de la gaussienne.
Voici une des références qui en donne la preuve.
la source