Générer une série de nombre aléatoire tous différents

Résolu/Fermé
kevdaig Messages postés 16 Date d'inscription dimanche 31 août 2014 Statut Membre Dernière intervention 22 février 2016 - Modifié par Whismeril le 30/01/2015 à 18:52
[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 - 3 févr. 2015 à 12:54
Bonjour,

Je dois générer une série de nombre aléatoire qui sont en fait des couples(x,y). Il doivent être tous différents les un des autres. Si je fais aller mon programme manuellement, l'ordinateur me génère des nombres uniques. Toutefois, lorsque le programme roule en mode normal, les chiffres sont tous identiques (une ligne sur 2 avec ce que j'ai en ce moment).

Comment faire alors pour générer des nombres différents? Voici mon code:

for (i = 0; i < NbMines; i++)
 {
  for(j=0; j < 2; j++)
  {
   if(j==0) // En X..
   {
    srand(time(NULL));
    TabPosMines[i][j]=rand()%DimX;
    
    if(i!=0)//Si nous ne sommes pas à la première ligne
    {
     while (TabPosMines[i][j]==TabPosMines[i-1][j]) 
     {
      TabPosMines[i][j]=rand()%DimX;
     }
    }
    printf("%d  ",TabPosMines[i][j]);
   }
   else // En Y...
   {
    srand(time(NULL));
    TabPosMines[i][j]=rand()%DimY;

    if(i!=0)//Si nous ne sommes pas à la première ligne
    {
     while (TabPosMines[i][j]==TabPosMines[i-1][j])
     {
      TabPosMines[i][j]=rand()%DimY;
     }
    }
    printf("%d  ",TabPosMines[i][j]);
   }
  }
  printf("\n");
 } 


EDIT: Ajout de la coloration syntaxique.

KevDaig
A voir également:

2 réponses

[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 1 097
Modifié par [Dal] le 3/02/2015 à 12:55
Salut kevdaig,

gravgun a très bien expliqué la cause de ton problème : il faut sortir
srand
de tes boucles et ne l'appeler qu'une fois avant tout appel à
rand
.

Je voulais juste attirer ton attention sur le fait que je ne crois pas que ton programme fasse en sorte qu'il "génère des nombres uniques", ou "tous différents les un des autres" dans le contexte d'un tirage de coordonnées.

Si le but est de vérifier que le programme ne génère pas deux fois les mêmes coordonnées x et y localisant l'emplacement d'un certain nombre de "mines" dans un espace à deux dimensions, il faudrait à chaque tentative de tirage, vérifier qu'aucun de tous les tirages précédents ne correspond au nouveau tirage (pas seulement celui qui précède).

Comme c'est assez lourd, et que tu peux avoir à faire ce type de vérifications souvent dans ton code, tu peux ruser en organisant tes données différemment.

Un moyen simple, mais plus consommateur de mémoire, consiste à
- créer un tableau à deux dimensions, dont les dimensions correspondent au terrain à miner,
- à l'initialiser (à zéro par exemple),
- à mettre une valeur aux coordonnées correspondant au tirage représentant une mine, à moins que cet emplacement ne soit pas libre, et à répéter le tirage tant que l'emplacement désigné n'est pas libre

La vérification de ce qu'il existe ou non une mine à des coordonnées données devient triviale, il suffit d'accéder au contenu du tableau.

Il se peut aussi que je n'aie rien compris à ce que tu veux faire car tes explications étaient assez elliptiques, dans ce cas ignore mon message :-D


Dal
1
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
31 janv. 2015 à 20:32
'lut, ils sont tous identiques car tu rappelles
srand
à chaque itération, et comme générer un nombre aléatoire prend très peu de temps (moins d'1 seconde), la valeur fournie a
srand
est toujours la même. Donc vire moi ça, et mets en un seul au début.

De manière générale, avec un générateur de nombre pseudo-aléatoire, on ne donne de seed qu'une seule fois, au début du programme, jamais après.
0
kevdaig Messages postés 16 Date d'inscription dimanche 31 août 2014 Statut Membre Dernière intervention 22 février 2016
3 févr. 2015 à 00:43
Tu as tout à fait raison! Merci
0