vers l'index général de l'aide
Obtenir des nombres aléatoires dont la succession ne varie pas d'un rendu à l'autre.
POV-Ray 3.0 +sup.
#declare NombreAleatoire = rand(seed(Graine)); ou bien : #declare Liste1 = seed (Graine); #declare NombreAleatoire = rand (Liste1);
La fonction rand renvoie une valeur comprise entre 0 et 1 (1 non inclus), de manière (pseudo-)aléatoire.
La gestion des nombres aléatoires dans POV-Ray s'appuie sur le concept suivant : une succession infiniment longue de valeurs aléatoires est générée à partir d'un paramètre appelé seed ("graine", en anglais). Des valeurs de seed différentes engendreront des successions de nombres aléatoires différents, mais un même seed donnera toujours la même suite de nombres.
C'est un peu comme si on avait à disposition une infinité de "listes" de nombres aléatoires, et qu'on peut choisir dans laquelle de ces listes on va chercher le nombre suivant.
L'intérêt de ce système, c'est la possibilité, dans la même scène, d'utiliser plusieurs seed différents, qui ne vont pas se parasiter.
exemple :
#declare r1=seed(82) #declare r2=seed(240) #declare boucle = 0; #while (boucle < 20) sphere {< rand(r1)*10,rand(r1)*10,rand(r1)*10 >, rand(r2) pigment {Red}} #declare boucle=boucle+1; #end
Dans cet exemple, 20 sphères sont placées aléatoirement dans l'espace. Leur position xyz est contrôlée par la "liste" r1, tandis que leur rayon est contrôlé par r2. En clair, cela veut dire que si le seed choisi pour r1 me donne une belle disposition, je peux jouer sur les rayons séparément, sans chambouler la disposition des sphères, ce qui se serait produit si j'avais employé r1 partout.
La constance des tirages aléatoires d'un rendu à l'autre est valable uniquement sur la même configuration matérielle, une différence de processeur (Intel, Motorola, Alpha,..) ou de système d'exploitation, provoquera une différence de tirage.
Attention donc, si vous voulez distribuer le calcul d'une image ou d'une animation sur des systèmes différents. Dans ce cas, vous pourriez prendre la précaution de stocker les valeurs du tirage dans un fichier externe (#fopen,...).
Pour modifier la plage de nombres obtenus, il suffit de faire une opération sur rand : rand(r1)*5, par exemple, pour obtenir des nombres de 0 à 5.
On peut également forcer la sortie de nombres entiers. Par exemple, pour un jet de dé à 6 faces :
#declare JetDe6Faces=1+int(6*rand(r1));
Il est possible, moyennant un petit bricolage, d'obtenir des valeurs différentes à chaque rendu. C'est ce qu'on peut découvrir sur la page des aléatoires vraiment aléatoires.
rédacteur : Fabien Mosen