Créer des nombres aléatoires

C’est ma première question ici. Je fais un petit jeu. Pour atsortingbuer les rôles, j’ai besoin de nombres aléatoires. J’ai ce code, mais est-il possible que les chiffres ne soient pas répétés? Merci.

void giveroles() { srand(time(NULL)); int r = rand() % i + 1; switch ( r ) { /* ... */ } } 

Si vous souhaitez affecter de manière aléatoire un petit ensemble de nombres, plutôt que de les générer de manière aléatoire, créez une liste des nombres souhaités, puis randomisez l’ordre de la liste (effectuez une itération sur la liste, échangez les entrées de manière aléatoire).

Par exemple:

 int cards[52]; for(int i = 0 ; i < 52 ; i++) { cards[i] = i; } for(int i = 0 ; i < 1000 ; i++) { int r1 = rand()%52; int r2 = rand()%52; int t = cards[r1]; cards[r1] = cards[r2]; cards[r2] = t; } for(int i = 0 ; i < 52 ; i++) { printf("%d\n", cards[i]); } 

Pour être complet, il a été souligné que le armsage de cette manière est biaisé. Voici une variante qui devrait être impartiale:

 cards[0] = 0; for(int i = 1 ; i < 52 ; i++) { int r = rand() % (i+1); cards[i] = cards[r]; cards[r] = i; } 

(il convient de noter en outre que prendre le module de rand () risque également d'être biaisé, car la plage de rand () ne sera pas un multiple pair)

Sortez la ligne srand(time(NULL)); . En général, vous ne devriez le faire qu’une fois dans votre programme, par exemple au début de main() , afin de rendre aléatoire le germe utilisé par les appels ultérieurs de rand() .

Si vous ne voulez pas répéter des nombres aléatoires, la solution consiste à garder une trace des numéros aléatoires que vous avez utilisés précédemment. Si vous obtenez un “hit” dans votre liste de numéros existants, essayez à nouveau.

En outre, utilisez srand(time(NULL)); ne devrait être fait qu’une fois. Je suppose que c’est plus la question que vous posiez réellement.