Nombres aléatoires suivant une loi gaussienne (loi normale)

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
aenimo
Messages: 4
Enregistré le: 25 Oct 2007, 22:15

nombres aléatoires suivant une loi gaussienne (loi normale)

par aenimo » 26 Oct 2007, 14:07

Bonjour à tous,

dans un programme j'utilise une fonction qui me retourne une valeur aléatoire v dans [0,1].

la distribution est équiprobable et donc la moyenne des valeurs est 0,5.

Code: Tout sélectionner
p|
 |
 |----------
 |%%%%%%%%%|
 |%%%%%%%%%|
-|---------|----- v
 0         1


maintenant je voudrais modifier mon programme pour avoir une distribution gaussienne (en gardant la même moyenne).


Code: Tout sélectionner
p|    -
 |   |%|   
 |  /%%%\         <- loi gaussienne
 |-'%%%%%'-
-|---------|----- v
 0         1


je cherche donc la fonction f à appliquer à chaque valeur tirée pour changer la loi de répartition.

mais mes valeurs doivent rester dans [0,1] donc je dois borner ma gaussienne, à 95% par exemple.

quelqu'un saurait-il m'aider à trouver f(v) ??



tize
Membre Complexe
Messages: 2385
Enregistré le: 16 Juin 2006, 20:52

par tize » 26 Oct 2007, 14:53

Bonjour,
voici le peu que je sais :
Si et sont deux variables aléatoires indépendante et uniformes sur alors suit une loi normale centrée et réduite

Flodelarab
Membre Légendaire
Messages: 6574
Enregistré le: 29 Juil 2006, 15:04

par Flodelarab » 26 Oct 2007, 15:08

L'application de la définition ne suffit elle pas ?



a toi de faire varier les parametres au besoin. non ?

Lierre Aeripz
Membre Relatif
Messages: 276
Enregistré le: 14 Mai 2007, 18:31

par Lierre Aeripz » 26 Oct 2007, 15:26

Flodelarab a écrit:L'application de la définition ne suffit elle pas ?



a toi de faire varier les parametres au besoin. non ?


Le problème d'obtenir une loi de répartition donnée à partir d'une loi uniforme est un problème compliqué. Pour les loi couramment utilisées, on dispose de bonnes méthodes, comme celle que présente tize (ou des variantes pour une meilleure stabilité numérique). D'ailleur, à quoi vourdais-tu appliquer la fonction ?

BQss
Membre Irrationnel
Messages: 1202
Enregistré le: 02 Nov 2006, 04:32

par BQss » 26 Oct 2007, 18:36

Flodelarab a écrit:L'application de la définition ne suffit elle pas ?



a toi de faire varier les parametres au besoin. non ?


On veut une fonction qui retourne une valeur aleatoire selon une loi, pas une fonction qui renvoie la valeur de la densité d'un evenement donné en argument.

en prenant l'exemple des piles ou faces:

on veut une fonction qui genere aleatoirement un resultat pile ou un resultat face selon la loi des piles faces(bernoulli) et non la valeur de la probabilité d'un pile ou d'un face.



Pour revenir a la question donc tize a donné une parfaite solution et c'est le plus simple. On peut aussi simuler une loi binomiale et prendre un "n grand" et un "p" petit dedans. Voila ce que j'ai fait en C++:

int generateurbinomiale(float p, int n) //creation d'une occurence suivant la loi de bernoulli :

{
float * x= new float[20000];
int p1=0;
for(int i=1;i=t1) p++;//processus de comptage suivant une loi de poisson
//cout<<p<<endl;
}
delete x;
return p;
}

aenimo
Messages: 4
Enregistré le: 25 Oct 2007, 22:15

par aenimo » 26 Oct 2007, 18:53

tize : je ne vois pas comment l'appliquer. je n'ai qu'une seule variable mais je vais y réflêchir (je suis un peu rouillé des maths).

Flodelarab a écrit:L'application de la définition ne suffit elle pas ?

je ne pense pas. c'est la fonction qui sert à representer la loi de probabilité mais pas celle qu'on applique aux tirages pour les faire suivre cette loi. enfin il me semble. j'ai essayé de déduire la formule de ta fonction mais je ne sais plus faire...

Lierre : je développe un plugin audio qui lit un court échantillon audio périodiquement (la période pouvant être élevée).
avec une période constante j'obtient un son continu à la sonorité métallique (car il se crée un filtre en peigne).
en ajoutant de l'aléatoire (variation de la période suivant la loi équiprobable) le son se transforme et j'otiens des sons plus "naturels" évoquant des frottement, du vent, des écoulements (cela dépend de l'échantillon utilisé). mon but est donc de tester si une répartition gaussienne de la période aurait un caractère sonore différent et plus naturel (en partant de l'idée que les phénomènes naturels suivent souvent des lois normales).

ce n'est donc pas une application critique et une approximiation suffirait.

aenimo
Messages: 4
Enregistré le: 25 Oct 2007, 22:15

par aenimo » 26 Oct 2007, 18:57

merci bien BQss je viens de voir ta réponse! je vais potasser ça!

BQss
Membre Irrationnel
Messages: 1202
Enregistré le: 02 Nov 2006, 04:32

par BQss » 26 Oct 2007, 19:03

PS, ce que j'ai ecrit est juste une autre maniere(faire converger la binomiale), mais ce qu'a dit Tize est encore plus simple:


tize a écrit:Bonjour,
voici le peu que je sais :
Si et sont deux variables aléatoires indépendante et uniformes sur alors suit une loi normale centrée et réduite


Je te conseille de faire comme ca.

Tu n'as plus qu'a generer un resultat suivant une loi uniforme continue sur [0;1](en c++):

float hasardContinue(int a, int b)
{return ( a + float ( rand()) /RAND_MAX *(b-a)) ;}

avec rand() une fonction qui renvoie une valeur aleatoire entiere entre 0 et Rand_max(constante prédéfinie)

Prend a = 0 et b=1 et tu renvoies cette valeure:



Pour avoir un resultat aleatoire suivant une loi normale N(M,A).

BQss
Membre Irrationnel
Messages: 1202
Enregistré le: 02 Nov 2006, 04:32

par BQss » 26 Oct 2007, 20:17

aenimo a écrit:tize : je ne vois pas comment l'appliquer. je n'ai qu'une seule variable
tu as juste besoin d'utiliser deux fois la fonction renvoyant un hasard de loi uniforme. Ces deux resultats sont independants.

Flodelarab
Membre Légendaire
Messages: 6574
Enregistré le: 29 Juil 2006, 15:04

par Flodelarab » 26 Oct 2007, 21:27

Je me rends bien compte que ce que j'ai proposé est inadéquat si on veut strictement une répartition gaussienne.

Mais si on veut un tirage aléatoire non uniforme en partant d'un tirage uniforme, on peut régler la moyenne et l'écart type pour avoir un déséquilibre contrôlé autour d'un valeur donnée sans se perdre à faire un calcul sur 20000 rangs.


Qu'en pensez vous ?

BQss
Membre Irrationnel
Messages: 1202
Enregistré le: 02 Nov 2006, 04:32

par BQss » 26 Oct 2007, 21:47

La methode de tize ne necessite aucune boucle et necessite une ligne de code, la mienne une 100taine pour atteindre une aproximation de l'ordre de quelques centiemes et 5 lignes de code(plus precise que la premiere methode).

On ne peut pas simplement ajuster la moyenne et la variance car malheureusement, elle ne suffisent pas a caracteriser une variable aleatoire.
Elles suffisent simplement a caracteriser une loi si le modele est le meme.
Exemple si deux gaussiennes ont la meme var et la meme esp ces variables suivent la meme loi.

Il faut donc bien simuler ces lois et ca ne se fait pas juste avec l'esperance et la variance d'une loi uniforme. Faire autrement serait du rafistolage, tres couteux et peu precis...

Exemple je crée un tableau ou les nombres de cases sont pondérés par la loi normale centrée reduite(ca deja il faut le faire et le "moins mal" possible...) et je tire aleatoirement selon une loi uniforme des cases dans ce tableau. Tu noteras qu'on utilise forcement la fonction rand(), qui est la seule chose dont on a besoin pour les autres methodes... Ou alors je demande a l'utilisateur de tirer lui meme une case du tableau, mais je dois alors reinitialiser le tableau en changeant les cases attribuées a chaque nouveau tirage pour que l'utilisateur puisse servir de "piocheur au hasard", mais se pose alors la question de comment automatiser cela, sans la fonction rand(), ca risque d'etre excessivement long et reberbatif...

Mieux je genere le hasard de l'autre coté de l'ecran pour choisir la case du tableau, avec des dés ou en pensant a des nombres au hasards et en tantant autant que faire ce peu de ne pas etre influencé par les resultats que j'ai deja vu sortir...


exemple: la case 0 c'est -10, la case 1 c'est -9 .... pour -1 c'est les cases de 20 à 30 en 0 de 30 à 45 etc etc, meme chose pour les valeurs positives...
Puis je tire au hasard suivant une loi uniforme discrete une case du tableau. Et on peut faire de 0.5 en 0.5 etc reduire les ecarts et augmenter les cases en ponderant par la densité pour ameliorer le resultat et tendre vers le continu.

C'est le mieux qu'on peut faire et c'est tres laborieux, plus long et tres aproximatif, sans compter qu'il faut calculer un paquet de valeur ou alors automatiser ca, ce qui va encore demander du code et du savoir faire...

Mais si on veut un tirage aléatoire non uniforme en partant d'un tirage uniforme, on peut régler la moyenne et l'écart type pour avoir un déséquilibre contrôlé autour d'un valeur donnée sans se perdre à faire un calcul sur 20000 rangs


Tres bien, montre nous en 100 boucles maximum ce que tu proposes puisque tu peux ;) et sans utiliser de fonction random(qui renvoie un resultat aleatoire suivant une loi uniforme). Je crains justement que tu t'y perdes alors que tize sera couché depuis bien longtemps... Bien que recréer la fonction random puisse s'avérer etre un travail interessant :P...

BQss
Membre Irrationnel
Messages: 1202
Enregistré le: 02 Nov 2006, 04:32

par BQss » 29 Oct 2007, 23:56

Voila une idée sur comment créer un generateur aléatoire(pseudo aleatoire), c'est a dire une fonction random(), ici présenté ce sont des generateurs congruentiels lineaires http://www.apprendre-en-ligne.net/random/congrulin.html:
l'idée pour ceux que ca interesse, c'est de prendre le reste de la division par m d'une somme ax+b, avec a et b et m fixés selon certaines regles garantissant un resultat "correct" et x un entier choisit au hasard.
Ce resultat sera donc entre m-1 et 0, si l'on prend m<ax+b, ce qui est le cas en pratique.

Puis on redivise par m pour avoir un nombre entre 0 et 1.

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 67 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite