comment générer des nombres pseudo aléatoires gaussiens en c pour une moyenne et une variance données?

J’ai un code ici qui génère des nombres aléatoires ayant une moyenne 0f 1 et un écart std de 0,5. mais comment puis-je modifier ce code afin que je puisse denerate des nombres aléatoires gaussiens de toute moyenne et variance donnée

#include  #include  #ifndef M_PI #define M_PI 3.14159265358979323846 #endif double drand() /* uniform dissortingbution, (0..1] */ { return (rand()+1.0)/(RAND_MAX+1.0); } double random_normal() /* normal dissortingbution, centered on 0, std dev 1 */ { return sqrt(-2*log(drand())) * cos(2*M_PI*drand()); } int main() { int i; double rands[1000]; for (i=0; i<1000; i++) rands[i] = 1.0 + 0.5*random_normal(); return 0; } 

J’ai un code ici qui génère des nombres aléatoires ayant une moyenne 0f 1 et un écart std de 0,5. mais comment puis-je modifier ce code afin que je puisse denerate des nombres aléatoires gaussiens de n’importe quelle moyenne et variance donnée?

Si x est une variable aléatoire d’une dissortingbution gaussienne avec la moyenne μ et l’écart type σ , alors αx+β aura la moyenne αμ+β et l’écart type |α|σ .

En fait, le code que vous avez posté effectue déjà cette transformation. Il commence par une variable aléatoire avec moyenne 0 et écart type 1 (obtenu à partir de la fonction random_normal , qui implémente la transformation de Box-Muller ), puis la transforme en une variable aléatoire avec moyenne 1 et écart type 0.5 (dans le tableau de rands ) via multiplication et addition:

 double random_normal(); /* normal dissortingbution, centered on 0, std dev 1 */ rands[i] = 1.0 + 0.5*random_normal(); 

Il existe plusieurs façons de le faire. Toutes impliquent fondamentalement de transformer / mapper vos valeurs uniformément dissortingbuées en une dissortingbution normale / gaussienne. Une transformation en ziggourat est probablement votre meilleur pari.

N’oubliez pas que la qualité de votre dissortingbution finale dépend de votre RNG. Assurez-vous donc d’utiliser un générateur de nombres aléatoires de qualité (par exemple, Twister Mersenne) si la qualité des valeurs générées est importante.