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 :
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 :
Avec m = 100 et s = 20
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 :
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
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 :
Exponentielle :
Géométrique :
Beta :
Beta :
Hors ligne
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
Ca rend assez bien en tout cas, on dirait un peu des patterns de diffraction :

Hors ligne
Pages: 1