79 votes

srand() — pourquoi ne l'appeler qu'une seule fois ?

Cette question concerne un commentaire dans cette question Méthode recommandée pour initialiser srand ? Le premier commentaire dit que srand() ne doit être appelé qu'UNE SEULE FOIS dans une application. Pourquoi en est-il ainsi ?

8voto

sharptooth Points 93379

La raison en est que srand() définit l'état initial du générateur aléatoire, et toutes les valeurs produites par le générateur ne sont "assez aléatoires" que si vous ne touchez pas vous-même l'état entre les deux.

Par exemple tu pourrais faire :

 int getRandomValue()
{
    srand(time(0));
    return rand();
}

et ensuite, si vous appelez cette fonction à plusieurs reprises pour que time() renvoie les mêmes valeurs dans les appels adjacents, vous obtenez simplement la même valeur générée - c'est par conception.

3voto

achoora Points 729

Une solution plus simple pour utiliser srand() pour générer différentes graines pour les instances d'application exécutées à la même seconde est la suivante.

 srand(time(NULL)-getpid());

Cette méthode rend votre graine très proche du hasard car il n'y a aucun moyen de deviner à quelle heure votre thread a commencé et le pid sera également différent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X