Page 1 sur 1

Flocon (suite) et unitrand()

Posté : mar. 18 mai 2010, 17:27
par maurice
Bonjour,

J'ai eu envie de mettre un peu d'aléatoire dans la construction du flocon (1 fois en haut, une fois en bas) :

Code : Tout sélectionner

size(8cm,0);
void koch(pair A, pair B, int n,int i, pen stylo=black) {
          pair C;
          if (i==0) {
             C=rotate(120, point(A--B,1/3))*A;
     }
     else C=rotate(-120, point(A--B,1/3))*A;
          if (n>0) {
             koch(A,point(A--B,1/3),n-1,floor(2*unitrand()),stylo);
             koch(point(A--B,1/3),C,n-1,floor(2*unitrand()),stylo);
             koch(C,point(A--B,2/3),n-1,floor(2*unitrand()),stylo);
             koch(point(A--B,2/3),B,n-1,floor(2*unitrand()),stylo);
          }
          else draw(A--point(A--B,1/3)--C--point(A--B,2/3)--B,stylo);
}
pair z0=(0,0);
pair z1=(1,0);
pair z2=(0,-1);
pair z3=(1,-1);
koch(z1,z0,1,floor(2*unitrand()),red);
koch(z2,z3,1,floor(2*unitrand()),blue);


A chaque compilation, j'obtient la même figure, ce qui n'est pas trop normal pour une construction aléatoire ...

Je ne vois pas où est le problème !

Maurice

Re: Flocon (suite) et unitrand()

Posté : mar. 18 mai 2010, 17:41
par GM
maurice a écrit :Je ne vois pas où est le problème !

Simuler le hasard n'est pas facile.

Il faut changer le terme initial, pour changer de suite.

Ajoute ceci :

Code : Tout sélectionner

srand((int)time("%S"));

avant le premier appel de unitrand.

Re: Flocon (suite) et unitrand()

Posté : mar. 18 mai 2010, 18:01
par maurice
Merci, ca à l'air de fonctionner.

Peux tu m'éclairer sur le role et le sens de la commande :

Code : Tout sélectionner

srand((int)time("%S"));


Merci

Maurice

Re: Flocon (suite) et unitrand()

Posté : mar. 18 mai 2010, 19:16
par GM
maurice a écrit :Peux tu m'éclairer sur le role et le sens de la commande :

Code : Tout sélectionner

srand((int)time("%S"));

Les nombres obtenus par des appels successifs de unitrand, le sont suivant un algorithme qui est initialisé par une valeur entière passé à la procédure srand.

Pour changer l'entier passé à srand, là j'ai utilisé la fonction time qui va renvoyer un nombre de secondes (entre 0 et 59).
En fait time("%S") te renvoie une chaine, l'ajout de (int) convertit en entier.
Il n'y a donc que 60 cas de suites avec cette astuce (l'entier passé à srand est entre 0 et 59).

Si tu veux plus de diversité, tu vas pouvoir essayer ceci :

Code : Tout sélectionner

srand((int)time("%H%M%S"));

Les possibilités pour l'entier passé à srand iront de 0 à 235959... et tu ne tomberas pas sur la même série de valeurs produite par unitrand avant 24h et il faudra demain que tu compiles ton exemple à la même heure à la seconde près pour retrouver une figure identique.

Re: Flocon (suite) et unitrand()

Posté : mar. 18 mai 2010, 19:29
par OG
C'est classique en C. Les générateurs aléatoires ne sont aléatoires que par leur nom.
En réalité, pour les entiers, c'est une suite U_n qui va décrire un à un tous les entiers
compris entre 0 et Nmax. Une grande catégorie sont les générateurs à congruence
x_{n+1}=ax_n modulo b, il faut un bon choix de a et m.
C'est donc du pseudo aléatoire. C'est un bon sujet de probabilité, arithmétique, etc.
Les générateurs à congruence ont évidemment des limitations, du style (x_n/Nmax,x_{n+1}/Nmax)
appartient nécessairement à quelques droites de \R^2, ou (x_n/Nmax,x_{n+1}/Nmax, x_{n+2}/Nmax)
a quelques plans (quelques étant un nbre petit) dans \R^3.
Pour des grandes simulations cela a un impact non négligeable, et peut rendre invalide la simulation.

Donc quand tu exécutes un pg qui fait appel à rand il aura toujours la même suite de "tirage aléatoire",
vu que la suite est initialisée au même rang à chaque exécution. Pour cela on choisit un début qui
dépend de l'heure.

O.G.

Re: Flocon (suite) et unitrand()

Posté : mar. 18 mai 2010, 19:37
par GM
GM a écrit :Si tu veux plus de diversité, tu vas pouvoir essayer ceci :

Code : Tout sélectionner

srand((int)time("%H%M%S"));

Les possibilités pour l'entier passé à srand iront de 0 à 235959... et tu ne tomberas pas sur la même série de valeurs produite par unitrand avant 24h et il faudra demain que tu compiles ton exemple à la même heure à la seconde près pour retrouver une figure identique.

Tu ne tomberas pas sur la même série....
... sous réserve de ne pas être le lucky luke de la compilation asymptote qui est capable de compiler deux fois en moins d'une seconde. :mrgreen: :lol: :lol:

Re: Flocon (suite) et unitrand()

Posté : mar. 18 mai 2010, 19:49
par maurice
Merci,

Encore beaucoup de choses à apprendre sur asymptote.

Maurice