Profitez-en, après celui là c'est fini

Processing, sixième cours

novembre 27th, 2008 Posted in Processing

Le hasard informatique

Le hasard informatique est une notion curieuse car par essence, l’ordinateur ne fait jamais rien au hasard.
À une question donnée, il apportera toujours la même réponse.
Par exemple si je demande à un ordinateur de me dire si 10 est égal à 10, il me répondra toujours oui, et si je lui demande d’aditionner 2 et 2, il me répondra invariablement 4. C’est ce que l’on entend par la phrase «.L’ordinateur ne peut pas se tromper.», phrase qui a produit des contre-sens car elle a souvent été comprise comme «.L’ordinateur sait tout.», mais c’est une autre histoire1 .

Pour que l’ordinateur change de réponse à une question, il lui faut une condition extérieure, à savoir l’interactivité, au sens large, c’est à dire l’échange de données avec une condition extérieure telle qu’un autre ordinateur ou les informations envoyées par un système de saisie quelconque. Ainsi votre ordinateur n’affiche pas toujours le curseur à la même position sur l’écran car il est sensible aux mouvements que vous donnez à un périphérique de saisie tel que la souris ou le pad.
Pour obtenir un chiffre au hasard à l’aide d’un ordinateur, on utilise généralement une méthode simple et satisfaisante dans de nombreux cas, qui est de vérifier l’état de l’horloge du système au moment de l’exécution du programme et de traiter le chiffre obtenu avec un algorithme gaussien ou autre. Tous les ordinateurs disposent d’une horloge interne qui leur permet non seulement à la machine de savoir l’heure et la date, mais surtout de synchroniser électroniquement ses différents composants. C’est le seul composant de l’ordinateur qui n’est jamais éteint, il est alimenté par une pile bouton.
Avec notre hasard basé sur l’heure, on parle de chiffres pseudo-aléatoires car en théorie, deux ordinateurs parfaitement identiques, réglés sur la même heure à la micro-seconde près et sollicités au même instant devraient fournir le même chiffre.

Pour obtenir un chiffre pseudo-aléatoire simple avec processing, on utilise la fonction random();, qui s’utilise avec un ou deux arguments.
random(10) renverra un chiffre décimal (à virgule) compris entre 0 et 10. Par exemple 6.2434893
random(10, 20) renverra un chiffre décimal compris entre 10 et 20. Par exemple 19.80756
La syntaxe est donc random(maximum) ou random(minimum, maximum). La valeur minimum peut être un chiffre négatif (random(-10,10) renverra un chiffre compris entre -10 et 10), en revanche elle ne peut être un chiffre supérieur à la valeur maximum : random(10,-10) renverra toujours 10.
En pratique, on peut utiliser le hasard chaque fois que l’on manipule des coordonnées ou des valeurs telles que celles des couleurs. Dans l’exemple qui suit, nous agissons sur les coordonnées de lignes :

Le programme utilisé ici commence par effectuer les réglages d’environnement d’exécution : fenêtre de 530×100 pixels, adoucissement des lignes, traits blancs, fond noir, traits de 2 pixels d’épaisseur. Ensuite, huit lignes sont tracées à l’aide de la commande line(x1, y1, x2, y2), que nous avons déjà étudiée en détails.

size(530,100);smooth();stroke(255);background(0);strokeWeight(2);
line(0,random(100),530, random(100));
line(0,random(100),530, random(100));
line(0,random(100),530, random(100));
line(0,random(100),530, random(100));
line(0,random(100),530, random(100));
line(0,random(100),530, random(100));
line(0,random(100),530, random(100));
line(0,random(100),530, random(100));

On remarque que les paramètres de line sont ceux-ci :
– l’abscisse du premier point est le chiffre 0 (zéro).
– l’abscisse du second point est le chiffre 530.
Donc nos lignes commencent invariablement à gauche de l’écran et se terminent invariablement à droite de l’écran. En revanche,
– l’ordonnée du premier point est « random(100) », c’est à dire un chiffre quelconque entre 0 et 100, par exemple 12.01681 (les chiffres décimaux sont notés à l’aide d’un point (.) et non à l’aide d’une virgule (,))
– l’ordonnée du second point est aussi « random(100) », c’est à dire un autre chiffre quelconque entre 0 et 100.

à présent, si je remplace l’ordonnée du premier point par un hasard délimité comme random(5,50) et que je remplace l’ordonnée du second point par random(50,95), j’obtiendrais un résultat tel que celui-ci :

Même si le résultat sera différent à chaque exécution du programme, nous obtenons une apparence d’ordre un peu plus grande que dans le cas précédent, car le premier point sera toujours plus haut ou égal (dans le cas rare ou nous obtiendrions le chiffre 50) au second.
Ici la commande répétée huit fois, était donc

line(0,random(50),530, random(100));

On peut adapter le hasard à de nombreux cas.
background(random(255)); peindra la fenêtre d’affichage dans une valeur de gris comprise entre le noir (0) et le blanc (255).
– background(random(255), random(255), random(255)); peindra la fenêtre d’affichage dans une couleur quelconque parmi les 16 777 216 de couleurs (256 niveaux de rouge x 256 niveaux de vert x 256 niveaux de bleu) que sait afficher la carte graphique d’un ordinateur typique.
stroke (255 , 255, random(255)); fera que les traits auront une couleur comprise entre le jaune (255,255,0) et le blanc (255,255,255).
fill (random(200,255), random(100,150), 0); décidera que les remplissages de formes auront une teinte plus ou moins orangée (beaucoup de rouge, un peu de vert, pas de bleu du tout).
ellipse (100,100, random(10), random(10)); dessinera une ellipse dont le centre sera le point (100,100) et dont le diamètre vertical comme le diamètre horizontal seront des chiffres compris entre 0 et 10.
– les points, rectangles, triangles, etc., peuvent être affichés avec des coordonnées au hasard.

L’image qui est affichée ci-dessus utilise deux notions que nous n’avons pas encore abordé :
– les boucles (ou itérations) qui permettent d’exécuter une action de manière répétitive et progressive. Dans le cas présent, il s’agit de dessiner une ellipse tous les dix pixels.
– les variables, qui permettent de stocker une valeur. Je les emploie ici pour donner à l’ellipse un diamètre égal dans sa largeur et dans sa hauteur, afin que ces ellipses soient des cercles.

Grâce aux boucles et aux variables, je peux, avec quelques lignes de code seulement, dessiner 53 x 10 cercles (soit 530 cercles, vous pouvez les compter) d’un diamètre de 1 à 10 pixels, remplis avec une couleur choisie au hasard dans une gamme orangée :

size(530, 100);background(255); noStroke(); smooth();
for(int a=0; a<53;a++){
   for(int b=0; b<10;b++){
     fill(random(200,255), random(50,150),0);
     float diametre = random(1,10);
     ellipse(a*10+5, b*10+5, diametre, diametre);
  }
 }

Les boucles feront l’objet du prochain article.

Sur le hasard, il faut encore savoir qu’il existe une alternative à la commande random(), qui est la commande noise();. Cette commande utilise le « bruit de Perlin » (d’après le nom de son inventeur, Ken Perlin), qui permet d’obtenir un hasard un peu mieux distribué que celui que produit la commande random();. Cette manière de générer du hasard informatique est très utilisée pour les calculs de textures par exemple.
L’utilisation de noise est assez différente de celle de random, car noise renvoie un chiffre compris entre 0 et 12 . De plus noise est invoqué avec un, deux ou trois paramètres et chaque fois que l’on demande la valeur de noise pour un paramètre précis, la commande renverra le même résultat. C’est à dire que si je demande à voir la valeur de noise(1) à un moment donné et que je la redemande un peu plus tard (mais sans redémarrer le programme), j’obtiendrais chaque fois le même résultat. L’essai qui suit utilise les deux formes de hasard, avec les mêmes contraintes de minimum/maximum, pour les couleurs de remplissage et pour les tailles de rectangles.
À gauche, noise(), et à droite, random().

noise(); n’est pas très compliqué à utiliser mais random(); est suffisant dans la plupart des cas, nous pouvons nous y tenir.

  1. Sur la question du hasard comme notion mathématique, et sur la question du hasard dans la nature (est-ce qu’il existe, déjà ?), je recommande le très plaisant ouvrage d’Ivar Ekeland, Au hasard, publié en poche aux éditions du Seuil. Ivar Ekeland est un mathématicien de haut-vol spécialiste du chaos, qui n’a jamais peur de captiver son public ni de faire des aller-retours entre physique, histoire et littérature. []
  2. Dans de nombreux langages, la commande random renvoie un chiffre compris entre 0 et 1. Par exemple avec le langage Javascript on écrira Math.random()*100 pour obtenir un chiffre entre 0 et 100. Et Math.random()*50+50 pour obtenir un chiffre compris entre 50 et 100.   []
  1. 4 Responses to “Processing, sixième cours”

  2. By criquet on Oct 17, 2009

    Jai regarder attentionement et jai remarque une faute .. :
    « À droite, noise(), et à gauche, random(). »
    alors que sest linverse ..
    cordialement

  3. By Jean-no on Oct 17, 2009

    @criquet : Corrigé ! Merci

  4. By salix9506 on Avr 10, 2012

    Je reprends votre texte :

    Même si le résultat sera différent à chaque exécution du programme, nous obtenons une apparence d’ordre un peu plus grande que dans le cas précédent, car le premier point sera toujours plus haut ou égal (dans le cas rare ou nous obtiendrions le chiffre 50) au second.
    Ici la commande répétée huit fois, était donc

    line(0,random(100),530, random(100));

    Ne faut-il pas écrire :

    line(0,random(50),530, random(100));

    ???
    Merci pour toutes ces leçons.
    Cordialement.

  5. By Jean-no on Avr 10, 2012

    @salix9506 : si bien sûr ! Merci de ta vigilance :-)

Postez un commentaire


Veuillez noter que l'auteur de ce blog s'autorise à modifier vos commentaires afin d'améliorer leur mise en forme (liens, orthographe) si cela est nécessaire.
En ajoutant un commentaire à cette page, vous acceptez implicitement que celui-ci soit diffusé non seulement ici-même mais aussi sous une autre forme, électronique ou imprimée par exemple.