Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1001 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1330095
julien_54
Posté le 22-03-2006 à 12:10:59  profilanswer
 

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

mood
Publicité
Posté le 22-03-2006 à 12:10:59  profilanswer
 

n°1330157
julien_54
Posté le 22-03-2006 à 13:28:30  profilanswer
 

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 ...

n°1330199
Emmanuel D​elahaye
C is a sharp tool
Posté le 22-03-2006 à 14:08:42  profilanswer
 

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/
n°1330269
julien_54
Posté le 22-03-2006 à 15:16:26  profilanswer
 

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 ...
 
@+

n°1330872
Trap D
Posté le 23-03-2006 à 11:15:51  profilanswer
 

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

n°1330901
skelter
Posté le 23-03-2006 à 11:39:01  profilanswer
 

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
 

n°1331103
julien_54
Posté le 23-03-2006 à 15:27:15  profilanswer
 

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:

n°1331283
Sve@r
Posté le 23-03-2006 à 19:14:11  profilanswer
 

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.
n°1331300
skelter
Posté le 23-03-2006 à 19:59:11  profilanswer
 

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

n°1331794
julien_54
Posté le 24-03-2006 à 15:36:50  profilanswer
 

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  :)

mood
Publicité
Posté le 24-03-2006 à 15:36:50  profilanswer
 

n°1331797
julien_54
Posté le 24-03-2006 à 15:37:36  profilanswer
 

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  :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Lancement de plusieurs executables à partir d'un .batgenerer des statistiques à partir d'une feuille excel.
[Débutant] [VB.NET] Insertion image à partir d'une datagridvmixte de chiffre/lettre randomisé
Afficher un fichier portant un nom aléatoire ?[Résolu] Image aléatoire
lancer un programme a partir du htmlHEEEELP - Faire un executable autonome a partir d'un script VBA
Ecrire dans un .sh a partir de PhpSous win98 j'aimerai lancer un fichier.exe à partir d' un fichier.bat
Plus de sujets relatifs à : Génération d'un chiffre aléatoire à partir d'une loi gaussienne


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR