Boutique Cinema 4D
Affichage des résultats 1 à 8 sur 8

Discussion: Un vrai random...

  1. #1
    Squatteur
    Date d'inscription
    avril 2003
    C4D version
    R11
    OS
    Snow leopard
    Messages
    281

    Un vrai random...

    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?

  2. #2
    Pilier
    Date d'inscription
    juillet 2002
    C4D version
    R13 Visualize
    OS
    Win7 64bits
    Messages
    861

    Un vrai random...

    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

  3. #3
    Squatteur
    Date d'inscription
    avril 2003
    C4D version
    R11
    OS
    Snow leopard
    Messages
    281

    Un vrai random...

    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.

  4. #4
    Pilier
    Date d'inscription
    juillet 2002
    C4D version
    R13 Visualize
    OS
    Win7 64bits
    Messages
    861

    Un vrai random...

    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

  5. #5
    Big Boss Avatar de base80
    Date d'inscription
    février 2003
    C4D version
    R12 Studio
    OS
    Fémur
    Messages
    8 330

    Un vrai random...

    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.

  6. #6
    Pilier
    Date d'inscription
    juillet 2002
    C4D version
    R13 Visualize
    OS
    Win7 64bits
    Messages
    861

    Un vrai random...

    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

  7. #7

    Un vrai random...

    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

  8. #8
    Squatteur
    Date d'inscription
    avril 2003
    C4D version
    R11
    OS
    Snow leopard
    Messages
    281

    Un vrai random...

    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 :

    Code:
    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
    Code:
    random=((int(random*Nfin))+1);//arrondi à l'entier supérieur
    par cette ligne :
    Code:
    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

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •  
Mediaworks - Logiciels 3D | Design Internet - Creation site internet