Flocon (suite) et unitrand()

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Règles du forum
Pour toute demande d'aide pour la conception (ou la confirmation d'un code) d'une figure Asymptote, c'est ici.

J'invite ceux qui ont régulièrement des questions à poser à aller dans leur panneau de l'utilisateur pour indiquer dans la signature de leurs messages :

  1. Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
  2. Version d'Asymptote et éditeur utilisé pour les figures Asymptote
  3. Distribution LaTeX et éditeur utilisé pour les tex.


On va gagner du temps dans les réponses !
maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Flocon (suite) et unitrand()

Message non lu par maurice » mar. 18 mai 2010, 17:27

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
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Flocon (suite) et unitrand()

Message non lu par GM » mar. 18 mai 2010, 17:41

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.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: Flocon (suite) et unitrand()

Message non lu par maurice » mar. 18 mai 2010, 18:01

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
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Flocon (suite) et unitrand()

Message non lu par GM » mar. 18 mai 2010, 19:16

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.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

OG
V.I.P.
V.I.P.
Messages : 142
Enregistré le : dim. 7 mars 2010, 22:27

Re: Flocon (suite) et unitrand()

Message non lu par OG » mar. 18 mai 2010, 19:29

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.

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Flocon (suite) et unitrand()

Message non lu par GM » mar. 18 mai 2010, 19:37

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:
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: Flocon (suite) et unitrand()

Message non lu par maurice » mar. 18 mai 2010, 19:49

Merci,

Encore beaucoup de choses à apprendre sur asymptote.

Maurice
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

Répondre