Fonction aléatoire + boucle, ne pas generer deux fois le meme no

Lautomaticien Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'aimerais en savoir plus sur la fonction srand, en fait j'aimerais qu'elle génere a chaque fois un chiffre different, sans jamais mettre deux fois le meme.

par exemple, cette fonction affichera 100 nombre aléatoire mais surement au moins deux fois le meme, comment faire pour qu'elle affiche les nombre de 1 à 100, une seule fois chacun et dans un ordre aléatoire???

do
{
srand(time(NULL));
x=(rand()%100);
cpt++
}while cpt (!=101)


A voir également:

2 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

Tout d'abord, le srand(time(NULL)) ne doit être appliqué qu'une fois. Donc, il vaut mieux le mettre en dehors du while.

Pour ne tirer que des nombres différents, tu peux remplir un tableau de 100 cases contenant les nombres de 0 à 100.
Ensuite, tu fais une boucle pour mélanger le tableau. Tu génères deux indices aléatoires, tu mélanges les indices et tu boucles.

A la fin, tu affiches les éléments du tableau pour obtenir les nombres aléatoires sans doublon.

Cdlt,
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut Lautomaticien,

Tu peux remplir un tableau de 100 cases comme le propose fiddy, contenant des nombres de 1 à 100 (et non de 0 à 100), et dont les index seront donc de 0 à 99.

Ensuite, tu peux utiliser cet algorithme, qui, par rapport à la suggestion précédente, permet de systématiser les permutations, pour être sûr d'avoir un tableau bien mélangé, et de savoir quand t'arrêter par la même occasion :

https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

Je cite, dans sa version "élaborée" :

To shuffle an array a of n elements (indices 0..n-1):
for i from 0 to n - 1 do
j = random integer with i <= j < n
exchange a[j] and a[i]

Il faut développer une fonction qui renvoie un nombre aléatoire entre deux autres (random integer with i <= j < n) supérieur ou égal à la borne inférieure et strictement inférieur à la borne supérieure.


Dal
0