Génération d'un chiffre aléatoire à partir d'une loi gaussienne

Génération d'un chiffre aléatoire à partir d'une loi gaussienne - C - Programmation

Marsh Posté le 22-03-2006 à 12:10:59    

Bonjour, :hello:  
 
Je recherche un code source assez simple (pas une bibliothèque de 20 fichiers permettant de refaire l'ensemble des maths :sweat: ) permettant de générer un chiffre aléatoire à partir d'un loi gaussienne.
 
Genre je donne moyenne + écart type et il me donne une valeur aléatoire correspondante.
 
Si quelqun a ca sous le coude ca pourrait bien me dépanner (C'est pour faire des tests optimaux pour mon boulot, sans y passer 50 ans ...  :p )
 
Merci d'avance ! :D

Reply

Marsh Posté le 22-03-2006 à 12:10:59   

Reply

Marsh Posté le 22-03-2006 à 13:28:30    

Pour ceux que ca intéresse, j'ai trouvé ca sur le net :
 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
 
#define NBV 1000
 
int main(void)
{
 int i=0;
 float x1, x2, w, y1, y2;
 
 srand(time(NULL));
 
 for (i=0;i<NBV;i++)
 {
   do
   {
     x1 = 2.0 * (float)rand()/RAND_MAX - 1.0;
     x2 = 2.0 * (float)rand()/RAND_MAX - 1.0;
     w = x1 * x1 + x2 * x2;
   } while ( w >= 1.0 );
 
   w = sqrt( (-2.0 * log(w) ) / w );
   y1 = x1 * w;
   y2 = x2 * w;
      printf("%f %f\n",y1,y2);
 }
 return(0);
}
 
C'est pas très propre ni très beau mais ca me suffit...
Si vous avez d'autres propositions ...

Reply

Marsh Posté le 22-03-2006 à 14:08:42    

julien_54 a écrit :

Si vous avez d'autres propositions ...


Tu devrais recoder ça avec des doubles... Plus précis, plus rapide...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 22-03-2006 à 15:16:26    

J'ai fait quelques tests avec l'algo précédent et ça à l'air de bien générer une répartition gaussienne.  
 
(il est certain qu'il faut repasser un peu sur le code pour le rendre un peu plus joli...mais sinon il marche à peu près bien)
 
Voilà, c'est pas courant que l'auteur d'une question réponde lui même, mais au moins si quelqun d'autre cherche ...
 
@+

Reply

Marsh Posté le 23-03-2006 à 11:15:51    

Remarque hors de propos, mais quand même, tu génères un nombre, pas un chiffre...

Reply

Marsh Posté le 23-03-2006 à 11:39:01    

Code :
  1. x1 = 2.0 * (float)rand()/RAND_MAX - 1.0;
  2. x2 = 2.0 * (float)rand()/RAND_MAX - 1.0;
  3. w = x1 * x1 + x2 * x2;


 
le probleme avec ce genre de truc c'est que x2 dépend de x1, il n'est pas "aléatoire" par rapport à x1, donc w ne dépend que de x1
 

Reply

Marsh Posté le 23-03-2006 à 15:27:15    

julien_54 a écrit :

J'ai fait quelques tests avec l'algo précédent et ça à l'air de bien générer une répartition gaussienne.  
 
(il est certain qu'il faut repasser un peu sur le code pour le rendre un peu plus joli...mais sinon il marche à peu près bien)
 
Voilà, c'est pas courant que l'auteur d'une question réponde lui même, mais au moins si quelqun d'autre cherche ...
 
@+


 
C vrai ; "Le chiffre (Fabriciana niobe) est un papillon de la famille des nymphalidés".  :lol:  :lol:  :lol:

Reply

Marsh Posté le 23-03-2006 à 19:14:11    

julien_54 a écrit :

Code :
  1. srand(time(NULL))



Si t'es sur un Unixlike, utilise le getpid() pour srand dans ce style:

Code :
  1. srand(time(NULL) ^ getpid())


 
Ca te permet si tu lances ton pgm 2 fois dans un très court laps de temps style "pgm ; pgm" d'avoir quand-même une initialisation différente de srand() pour chaque processus générés...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 23-03-2006 à 19:59:11    

il y a différents exemples d'implémentations sur la faq comp.lang.c
http://c-faq.com/lib/gaussian.html

Reply

Marsh Posté le 24-03-2006 à 15:36:50    

Sve@r a écrit :

Si t'es sur un Unixlike, utilise le getpid() pour srand dans ce style:

Code :
  1. srand(time(NULL) ^ getpid())


 
Ca te permet si tu lances ton pgm 2 fois dans un très court laps de temps style "pgm ; pgm" d'avoir quand-même une initialisation différente de srand() pour chaque processus générés...


 
Pas mal ce petit truc, je tâcherai de m'en souvenir  :jap: Merci  :)

Reply

Marsh Posté le 24-03-2006 à 15:36:50   

Reply

Marsh Posté le 24-03-2006 à 15:37:36    

skelter a écrit :

il y a différents exemples d'implémentations sur la faq comp.lang.c
http://c-faq.com/lib/gaussian.html


 
Très bonne source  :love: Merci  :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed