IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

tableau à deux dimensions sans doublon c++


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut tableau à deux dimensions sans doublon c++
    Bonjour à tous,

    Je sollicite votre aide pour m'en sortir.
    Je suis entrain de code un algorithme qui prend des nombres aléatoires et les mets dans un tableau à deux dimensions. Normalement ces nombres doivent être différents, or ce n'est pas le cas !
    voici le code :

    // pour chaque ressource, le nombre de taches pouvant être faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int bor_max_tache = nt;
    	 int bor_min_tache = 0;
    	 i=0;
    	 while (i<nr)
    	 {
    		 npr[i]=rand()%(bor_max_tache - bor_min_tache) + bor_min_tache;
    		 i++;
    	 }
    le nombre de tâches pour chaque ressource est stocké dans le tableau npr[maxT]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i=0; i<nr; i++) 
    	 {
    		 cerr << " ressource " << i << " peut faire " << npr[i] << endl;
    	 }
    Le résultat :
    ressource 0 peut faire 11
    ressource 1 peut faire 4
    jusqu'ici est correct, maintenant je veux tirer aléatoirement entre deux bornes (0 et 20) des nombres aléatoires et les stocker dans un tableau à deux dimensions sans avoir des doublons!
    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int mint=0;
    	 int maxt=nt;
    	 for(i=0; i<nr; i++) 
    	 {
    		 for(j=0; j<npr[i]; j++)
    		 {
    			 pr[i][j] =  mint + (rand () % (maxt-mint+1));
    		 }
    	 }

    Le résultat :
    ressource 0 : 11 tasks
    17 6 19 13 12 5 20 8 8 12 8
    ressource 1 : 4 tasks
    9 0 4 5
    Vous constatez que pour la ressource 0 il y a le numéro 8 qui se répète 3 fois or ce n'est pas le résultat souhaité !

    Je vous remercie de me corriger le deuxième code.
    Bien Cordialement,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 675
    Points : 10 689
    Points
    10 689
    Par défaut
    Ouais tu t'y prends mal
    Si tu veux X nombres entre A et B, je ferai comme cela

    Pour l'exemple disons 7 nombres entre 0 et 20.
    1. Je créé un tableau de 21 cases avec les nombres de 0 à 20 rangés de façon croissante: |0|1|2|3|4| .... |17|18|19|20| (*)
    2. Je génère 2 nombres aléatoires entre 0 et 20: G et H. Mais G et H doivent être différents. Et tu échanges la case n°G avec la case n°H
    3. Je répète le point 2 un certain nombre de fois (**)
    4. Je prends les 7 premières cases du tableau (***)


    Sinon il faut faire un test pour valider que le nombre aléatoire n'est pas égal avec les précédents (il est unique). Complexité en n²
    Édit sur un vieux message: Effectivement il y a ta solution qui consiste à utiliser un autre tableau qui contient un booléen pour tester si la case a été utilisée ou pas.
    Mais on retombe sur le problème (*)

    * -> Voire si le tableau ne prend pas trop de place, on un truc "en mémoire" si possible. À réfléchir
    ** -> À réfléchir. À tester
    *** -> En fonction de comment tu as créés ton tableau (*)

    Édit: Pour le point 2, pour éviter les tests par exemple, prendre G dans la première moitié du tableau [0 et 10] et H dans la seconde [11 - 20].
    À tester si cela mélange correctement le tableau

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 130
    Points : 33 063
    Points
    33 063
    Billets dans le blog
    4
    Par défaut
    Salut,

    pourquoi 2 dimensions ?
    si tu veux éviter les doublons, utilise simplement un set ?

  4. #4
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut réponse
    Citation Envoyé par Bousk Voir le message
    Salut,

    pourquoi 2 dimensions ?
    si tu veux éviter les doublons, utilise simplement un set ?
    Je m'en servirais après, car le bout de code que j'ai posté est juste un extrait du code général.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 130
    Points : 33 063
    Points
    33 063
    Billets dans le blog
    4
    Par défaut
    Ca ne change pas que tu peux passer par un set puis le transformer en tableau 2D.

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    Un set garantit l'unicité.
    Comme c'est exactement la propriété que tu souhaites, sers-t'en

  7. #7
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut solution
    Bonjour,

    Je reviens pour poster ma solution de ce problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    srand(time(NULL));
    	 for(r=0;r<nr;r++)
    	 {
    		for (j=0; j<npr[r];j++)
    		{
    			do
    			{
    				pr[r][j]= rand()%nt;
    			} 
    			while(ability[r][pr[r][j]]==true);
    			ability[r][pr[r][j]]=true;
    			vr[r][j] = pr[r][j];
    			cerr << " " << pr[r][j] << "  " << j << endl;
    		}
    	 }
    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2014, 11h23
  2. Supprimer les doublons dans un tableau à deux dimensions
    Par ouskel'n'or dans le forum Contribuez
    Réponses: 0
    Dernier message: 30/07/2008, 10h47
  3. Supprimer les doublons dans un tableau à deux dimensions
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 30/07/2008, 10h33
  4. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 22h38
  5. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 15h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo