PDA

Voir la version complète : Un vrai random...



Guedinouff
22/05/2005, 15h27
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?

Kaldera Lake
22/05/2005, 15h47
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

Guedinouff
22/05/2005, 21h09
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.

Kaldera Lake
23/05/2005, 02h52
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: :D

base80
23/05/2005, 03h01
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.

Kaldera Lake
23/05/2005, 03h14
oui et c'est pratique :D 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.

tarlack
23/05/2005, 09h48
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é

Guedinouff
25/05/2005, 17h56
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 :



Alea(Nfin,j)
{
var random = new(Random);
random->Init((time())*j);
random=random->Get01();
random=((int(random*Nfin))+1);
return random;
}

où le tirage se fait entre 1 et le nombre Nfin
Si on veut que le tirage se fasse entre 0 et Nfin-1, il suffit de remplacer cette ligne


random=((int(random*Nfin))+1);//arrondi à l'entier supérieur

par cette ligne :


random=(int(random*Nfin));

J'ai testé différentes modifications de Init :
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