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 ?
Réponses
Trop de publicités?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.
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.