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

Fermé
Lautomaticien Messages postés 1 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 7 avril 2014 - 7 avril 2014 à 13:01
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 8 avril 2014 à 13:28
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)


2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
7 avril 2014 à 23:28
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 8/04/2014 à 13:35
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