Bonjour tout le monde,
Pour la réalisation d'une petite expression, je souhaiterais choisir un sous-enfant d'un objet aléatoirement.
J'ai cherché dans le SDK coffee autour de la fonction random, et le problème, c'est que si on répète de façon très proche la même fonction en utilisant Init(time()), le nombre qui en retourne est identique (j'utilise le code en exemple de la fonction random du sdk).
Quelqu'un a-t-il une idée pour obtenir du "vrai" aléatoire en coffee?
L'astuce utilisée en generale constsite a initalisé ton random non avec time mais avec une suite quelconque dont tu incremente le rang a chaque appel du random, de sorte que lors de chaque apelle de la fonction la valeur du random soit différente. mais a chaque fois que tu redemareras le programme la suite sera la meme. et donc la sequance previsible.
Si tu veux quelque chose de vraiment completement aleatoire il faut initialiser la suite avec un time... ou stocker le dernier rang utilisé de la suite dans un fichier.
Bonne continuation
Tout le monde savait que c'était impossible, est venu un con qui ne le savait pas et qui l'a fait!
MarcelPagnol
Ok, merci Kaerel. Donc en gros faut modifier à chaque fois le nombre dans le init(...). C'est bizarre qaund même que c4d ne propose pas un random correct par défaut en coffe
Bon je réfléchis à çà et j'essaierai de poster le résultat.
Ce pb n'est pas propre a C4d, mais a l'informatique en generale, les ordis sont toutt sauf des machines à produir du hasar... bien que cela ne soit pas evident tout le temps lorsqu'un programme est mal foutu :? produire du hasar est donc un des petits defis de la programmation :wink:
je suis curieux de savoir a quoi cela va te servir de selectionner un objet aléatoirement... :roll:
Tout le monde savait que c'était impossible, est venu un con qui ne le savait pas et qui l'a fait!
MarcelPagnol
Je ne suis pas sur d'être on topic mais le random de c4d est le même a chaque fois qu'on joue la time line et c'est fait exprès. TP en fait usage pour faire le même random a chaque passage.
Donc pas besoin de baker le random en sorte.
Le random de xpresso produit a chaque coup les même chiffres a moins de randomiser le seed du random ou du moins modifier le seed.
Dans xpresso on utilise noise pour produire du random aléatoire.
Visitez www.base80.com et www.youtube.com/base80
oui et c'est pratique mais a parement il voullait que les selections soient justement différentes à chaque fois.
En revanche, pour avoir une valeur aleatoire dans Xpresso mieux vaut utiliser "valeur aleatoire" en mode libre.
Il y a un couplage entre les valeures successives avec le mode temporel et avec l'operateur bruit.
Tout le monde savait que c'était impossible, est venu un con qui ne le savait pas et qui l'a fait!
MarcelPagnol
salut!
j'ai eu ce meme probleme de random mais en C++, et vu que le generateur de la librairie standard du C++ me plaisait pas j'ai fait le mien (enfin j'ai pris un generateur dans un cours de modélisation), et il marche très bien. En fait c'est 2 générateurs aléatoires couplés, c'est un de ceux de Mr l'Ecuyer, si y en a qui connaissent ou que ca interesse.
Pour l'initialisation du generateur, il ne faut le faire qu'une seule fois, au début de la génération de la suite (vu comment c'est calculé ensuite c'est la seule manière d'avoir une suite pas trop prévisible).
si tu initialises ton generateur avec un time, elle ne sera jamais la meme entre 2 executions de ton programme, la valeur initiale n'étant pas la meme. Un generateur classique c'est toujours calculable par un humain s'il connait le 1er nombre, la suite étant parfaitement définie .c'est en general un truc de la forme x(n+1) = (a*x(n) + b) mod c, où a, b et c sont des constantes.
J'avais lu un truc sur un generateur informatique imprévisible (c'est à dire qu'un humain ne pourra dire quel nombre va sortir), il se base sur le fait que les OS sont multitaches. en recuperant les valeurs des registres du processeur à différents intervalles on arrive à une suite aléatoire, car la suite des valeurs des registres est imprévisible (ne se référant pas au meme programme).
Mais meme si vous n'avez pas envie de faire un generateur, je vous conseille, rien que pour les utiliser, de lire le début de cours de modélisation, ca en apprend pas mal et on comprend mieux comment ca marche, et comment il faut l'utiliser.
si c'est off-topic, désolé
Le rendu, c'est juste de l'intégration numérique sur un espââââââce de dimension infinie...trivial quoi
Bon je me suis penché sur le truc du Random.
Dans mon cas, le problème se résolvait plutôt simplement, vu que l'appel à la fonction aléatoire se faisait à chaque répétition d'une boucle for (de variable j).
J'appelle donc à chaque répétition de la boucle for une fonction de ce type :
où le tirage se fait entre 1 et le nombre NfinCode:Alea(Nfin,j) { var random = new(Random); random->Init((time())*j); random=random->Get01(); random=((int(random*Nfin))+1); return random; }
Si on veut que le tirage se fasse entre 0 et Nfin-1, il suffit de remplacer cette ligne
par cette ligne :Code:random=((int(random*Nfin))+1);//arrondi à l'entier supérieur
J'ai testé différentes modifications de Init :Code:random=(int(random*Nfin));
Voici les tirages obtenus avec la ligne suivante : random->Init((time())*j);
1er tirage : 2 4 6 7 9 11 1 2 4
2ème tirage : 4 8 12 3 7 11 3 6 10
Les tirages obtenus avec cette ligne là : random->Init((time())*j*j); :
1er tirage : 9 9 1 10 10 3 12 2 7
2ème tirage : 8 5 4 5 8 1 8 6 5
Les tirages obtenus avec cette ligne là : random->Init((time())*j*j*j); :
1er tirage : 1 3 8 5 9 9 6 2 10
2ème tirage : 2 12 4 9 1 1 4 8 10
Le Nfin était 12