Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab
> Nouveau : partage de liens / une carte des membres

apéro codelab #14 à Rennes, vendredi 3 février 2012, appel à participation

#1 2009-05-11 16:43:02 densité de répartition des nombres aléatoires

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1287
Site web

densité de répartition des nombres aléatoires



Bonjour,

Je cherche des algorithmes de tirages aléatoires avec densités de répartition...

Une image valant un long discours :
En utilisant la fonction random() de processing on obtient une densité uniforme des valeurs, exemple avec un tirage aléatoire de 50 000 points :

http://codelab.fr/up/random-uniform.png

Mais il existe d'autres lois fixant la densité de répartition. En cherchant j'ai trouvé cet algorithme en ruby, qui applique une densité normale à la répartition. 2 variables supplémentaires, m et s définissent la zone de répartition : m correspond à la valeur médiane et s, l'écart par rapport à cette valeur médiane :
Par exemple avec m = 0 et s = 100, on obtient :

http://codelab.fr/up/random-normal-0-100.png

Avec m = 100 et s = 20

http://codelab.fr/up/random-normal-100-20.png

il y a différentes lois de densité (sur wikipedia : lois de densité), mais je ne sais pas lire ces formules..., quelqu'un saurait-il transformer ça en fonction?

Les images sont faites avec ce sketch :

Code (p5) :

void setup() {
  size(400,400);
  background(0); stroke(255);
  noLoop();
  
}

void draw() {
  for (int i =0; i < 50000; i++) {
    float a = random (-PI,PI);
    //float d = random_uniform(0, 180);
    float d = random_normal(0, 180, 100, 20);
    float x = 200 + (d * cos(a));
    float y = 200 + (d * sin(a));
    point(x,y);
  }
}

float random_uniform(float xmin, float xmax) {
  float x = random(xmin, xmax);
  return x;
}

float random_normal(float xmin, float xmax, float m, float s) {
  float x = (s * sqrt(-2.0 * log(random(.0001,1))) * cos(2.0 * PI * random(0,1))) + m;
  return x;
}

Hors ligne

 

#2 2009-05-13 22:12:11 Re : densité de répartition des nombres aléatoires

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1287
Site web

Re: densité de répartition des nombres aléatoires



J'ai trouvé mon bonheur : colt une bibliothèque de fonctions scientifiques développée par le CERN, c'est du costaud, avec de nombreux modèles de distribution... et intégrable facilement à processing.

javadoc api : http://acs.lbl.gov/~hoschek/colt/api/index.html

Pour se faire une idée des distributions, le « Compendium of Common Probability Distributions » rend bien service, c'est remplie de formules qui me laissent froid, mais il y a aussi de bien belles courbes...

Quelques images pour tester différentes méthodes de distribution :

Distribution de Cauchy :

http://codelab.fr/up/random-cauchy.png

Exponentielle :

http://codelab.fr/up/random-exponential.png

Géométrique :

http://codelab.fr/up/random-geometric.png

Beta :

http://codelab.fr/up/random-beta.png

Beta :

http://codelab.fr/up/random-beta-2.png

Hors ligne

 

#3 2009-05-17 03:12:19 Re : densité de répartition des nombres aléatoires

juan
modérateur
Lieu: Nancy
Date d'inscription: 2008-02-23
Messages: 14
Site web

Re: densité de répartition des nombres aléatoires



La solution qu'on utilise classiquement pour régler la densité de probabilité d'une variable selon une loi quelconque c'est du pseudo-Monté-Carlo: j'ai la fleme de faire un dessin mais imaginons une variable x entre a et b, suivant une ddp (densité de proba) entre 0 et 1: pour tout x, x a une proba de P(x).

P(x) peut être n'importe quelle fonction: une vraie loi statistique ou un bricolage: peu importe, il faut juste être capable de calculer P(x).

L'algo a la forme suivante:
On tire 100000 valeurs de x au hasard entre a et b
{
     on calcule p=P(x) // par n'importe quelle méthode, on s'en fout, mais on le calcule.
    {   
     on tire une valeur y au hasard entre 0 et 1
         si y<p
         {
              alors on garde ce point
              // sinon, on l'oublie
         } // fin si
    }---- fin du "on tire une valeur de y"
}---- fin du "on tire 1000 points"

AU FINAL: il ne reste pas 100000 points, mais une fraction suffisante pour que que ceux qu'on a retenus suivent la loi P(x) qu'on a décidé de leur faire suivre.

Hors ligne

 

#4 2009-05-17 11:32:44 Re : densité de répartition des nombres aléatoires

Staross
membre
Date d'inscription: 2008-04-03
Messages: 322

Re: densité de répartition des nombres aléatoires



Ca rend assez bien en tout cas, on dirait un peu des patterns de diffraction :

http://media-2.web.britannica.com/eb-media/28/96828-004-644E46F6.jpg

http://upload.wikimedia.org/wikipedia/commons/archive/7/7d/20071104200851!X-ray_diffraction_pattern_3clpro.jpg

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2012