Implémentation d'une variable aléatoire gaussienne à l'aide d'une variable aléatoire uniforme

11

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 0et RAND_MAX. RAND_MAXn'a pas de valeur fixe, mais il est garanti qu'elle sera d'au moins . Son PDF est uniforme.2151

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.

PDF gaussien
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.107

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_SUMSsoit 100 et RAND_MAX32767.

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?

hkBattousai
la source
3
Il existe des moyens meilleurs et plus rapides que le théorème de la limite centrale pour générer des variables aléatoires gaussiennes. Rechercher la méthode Box-Muller pour un; une méthode en ziggourat serait encore meilleure.
Dilip Sarwate
3
12 U(0,1)1006N(0,1)Y=σX+μN(μ,σ2)(μ6σ,μ+6σ)
@DilipSarwate vous devriez peut-être poster ces alternatives comme réponse avec une justification de la raison pour laquelle nous le préférerions
Ivo Flipse
@IvoFlipse La réponse à la question demandait "Comment puis-je corriger la variance après avoir fixé la moyenne?" est essentiellement ce que dit la réponse acceptée par Hilmar, telle que modifiée par les commentaires: corriger la variance en mettant à l'échelle puis re-fixer la moyenne, ou mieux encore, ne commencez pas par fixer la moyenne en premier car vous devrez re-fixer plus tard; fixez d'abord la variance en mettant à l'échelle puis fixez la moyenne. L'OP n'indique pas qu'il / elle est du tout intéressé (e) par de meilleures méthodes et n'a même pas mis à jour le lien du nibot qui a même le code de la méthode Box-Muller. Je vais donc laisser les choses telles qu'elles sont.
Dilip Sarwate

Réponses:

6

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_SUMSinstances, la variance sera NUM_GAUSSIAN_SUMS/12. Pour arriver à une variance cible V, vous devez multiplier la variable aléatoire additionnée par sqrt(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.

Hilmar
la source
5

comment puis-je changer la variance de cette variable aléatoire?

cXcXc2X

Emre
la source
cXcX
1
Centrez, redimensionnez, puis rétablissez la moyenne. La mise à l'échelle d'une variable aléatoire centrée n'affectera pas la moyenne (zéro).
Emre
1

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

U[01]

X=FX1(U)

FX(x)

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.

Dipan Mehta
la source
3
> Il y a encore une autre façon! Certes, mais sans rapport avec la question à l'étude qui concerne spécifiquement les variables aléatoires gaussiennes. Ni le CDF gaussien ni son inverse ne peuvent être exprimés en termes élémentaires en utilisant un nombre fini d'opérations, et la méthode suggérée ne peut donc pas être utilisée.
Dilip Sarwate