Problèmes lors de l’appel de srand (time (NULL)) dans la fonction rollDice

Quand j’ai utilisé la première fois srand(time(NULL)) dans la fonction rollDice() , cela ne fonctionnait pas. Mais quand je le mets en gros, ça marche. Pourquoi donc? Pouvez-vous me dire la logique?

 #include  #include  #include  int rollDice(void) { return (1+rand()%6) + (1+rand()%6); } int main(void) { int roll; srand(time(NULL)); roll = rollDice(); printf("You rolled %d.\n", roll); enum Gamestatus {WON,LOST,CONTINUE}; enum Gamestatus status; while(status==CONTINUE){ printf("You are rolling again: \n"); printf("You rolled %d\n", roll = rollDice()); if (targetPoint==roll){ printf("You win!"); status=WON; } else if(7==roll){ printf("You lost!"); status=LOST; } else status=CONTINUE; } return 0; } 

Disons que vous avez des millions de livres avec des lignes sur des lignes de nombres aléatoires. Avant que vous obteniez un nombre aléatoire, vous devez sélectionner un livre.

Lorsque vous avez un livre, pour obtenir des nombres aléatoires, lisez-les successivement. Changer le livre obtient une autre séquence de nombres aléatoires.

srand() choisit un livre et commence des nombres aléatoires depuis le début
rand() lit le prochain numéro du livre sélectionné

Si vous mettez srand() dans la boucle, vous redémarrez effectivement la séquence de nombres aléatoires à partir du début du même livre.

Solution: sélectionnez 1 livre une fois et continuez à en lire les numéros pour toujours.

Dans un programme C, si vous ne “sélectionnez pas un livre”, les nombres aléatoires proviennent du livre n ° 1 ou, en d’autres termes, en l’absence d’un appel srand() , la fonction rand() se comporte comme si srand(1) a été appelé.

Lorsque vous effectuez l’ensemencement dans la fonction rollDice et que vous appelez ensuite cette fonction dans une boucle, non seulement vous ensemencez plus souvent que vous n’auriez dû, mais la boucle est si rapide que vous ensemencez avec la même valeur (même temps). ) qui donne en rand() retournant la même valeur:

La fonction srand() définit son argument comme germe pour une nouvelle séquence d’entiers pseudo-aléatoires à renvoyer par rand() . Ces séquences peuvent être répétées en appelant srand() avec la même valeur de germe.

Règle de base: Semer une seule fois.

Cela vaut la peine de jeter un coup d’œil aux questions précédentes sur ce problème:
srand (time (NULL)) ne change pas la valeur de départ assez rapidement
Toujours répété les nombres donnés par rand ()
La fonction srand renvoie les mêmes valeurs, etc.

Le problème est que la fonction srand () génère le générateur de nombres aléatoires et que vous l’affiche avec l’heure actuelle, qui a une résolution de 1 seconde. Ainsi, lorsque vous appelez srand () depuis l’intérieur de la fonction rollDICE (), vous obtenez le même résultat exact avec rand () à chaque appel ayant lieu dans la même seconde. Lorsque la seconde est lancée, vous obtiendrez un résultat différent de rand ().

Appeler srand () dans main signifie que vous ne l’appelez qu’une fois, avant de commencer à faire rouler, puis rand () vous renverra une séquence de nombres aléatoires.