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
5904
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 septembre 2022
- 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

2 réponses

[Dal]
Messages postés
5904
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 septembre 2022
1 011
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
4764
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
5 octobre 2021
1 299
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