Random

21:42 modifié dans API AppKit #1
Hello à  tous,

Voilà , j'ai remarqué qu'en randomizant un nombre, c'est toujours les memes randomization si l'on quitte et relance l'application.
Eclaircicement d'esprits :
Je lance l'app, je clique sur un bouton, ça m'affiche par exemple 5, je reclique, ça m'affiche 32...
Je quitte et relance l'app, je clique sur un bouton, ça m'affiche encore 5, je reclique, ça m'affiche encore 32..
Mauvaise randomization ou bien il n'y a aucun échapatoire ?

Réponses

  • ChachaChacha Membre
    mars 2005 modifié #2
    J'imagine que tu fais un rand() classique du langage C ?
    Si tu veux changer la suite (pseudo) aléatoire générée par des appels successifs à  rand(), il faut changer la "graine" qui initie la suite lors du lancement du programme.
    Pour spécifier la graine, il faut utiliser srand(int seed)
    Sauf que... il faut que la graine soit elle-même aléatoire, dans ton cas.

    La technique usuelle est la suivante:

    <br />//dans le main<br />srand(time(NULL)) /*initialise la graine au nombre de secondes écoulées depuis la création d&#39;Unix */<br />
    



    Précisons toutefois qu'il est très important de pouvoir générer deux fois une suite pseudo-aléatoire. Dans le cadre d'une simulation, il est vital d'avoir des suites reproductibles. Le comportement par défaut que tu as observé, qui est celui de n'être pas "complètement" aléatoire entre deux lancements, est donc un avantage plutôt qu'un inconvénient.

    Voilà 

    Et pour ceux qui sont intéressés par une encapsulation C++ propre et pratique d'un bon générateur aléatoire des numerical recipes, j'en profite pour me faire un peu de pub:
    http://ktd.club.fr/programmation/cpp-random.php

    +
    Chacha


    PS: pis au fait, on dit *une* échapPatoire; pour fouf : nan, je suis pas prof de français, je suis juste un cauchemard ambulant ;-)
  • VeillardVeillard Membre
    21:42 modifié #3
    J'ai un extrait de code pour un NSPoint ça pourrait servir...

    <br />x = (random() % width) + r.origin.x<br />
    


    au cas où...

Connectez-vous ou Inscrivez-vous pour répondre.