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 :

Remplir un tableau alétoire de 7 chiffres différents


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Remplir un tableau alétoire de 7 chiffres différents
    Bonjour !
    Je voudrais générer un tableau de 7 entiers aléatoires compris entre 0 et 6, sans doublon.
    J'ai donc fait le script suivant :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <iostream>
    #include <cmath>
     
    using namespace std;
     
    int main(){
      int i,j,tableau[7];
      bool bon;
     
      for(i=0;i<7;){
        tableau[i]=(int)(6.*rand()/7);
        bon=true;
        if (i>0){
          for (j=0;j<i;j++){
            if (tableau[i]==tableau[j]){
              bon=false;
              break;
            }
          }
        }
        if(bon){
          i++;
        }
      }
     
      for(i=0;i<7;i++){
        cout << endl << tableau[i];
      }
    }
    Mais après de multiple test, je me suis rendu compte que c'était la fonction rend qui renvoyé tjs la même valeur à savoir 1.80429e+09.

    Savez vous d'où viens mon erreur ?

    Merci d'avance
    Natim

  2. #2
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Je sais qu'en C, la fonction rand() doit être initialisée, par un appel à srand() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <time.h>
    #include <stdlib.h>
    ...
    srand(time(NULL));
    Je ne sais pas en C++, mais le mécanisme est peut-être similaire....

  3. #3
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Salut,
    en C++, tu peux utiliser random_shuffle qui fait parti de la STL
    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
     
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int main()
    {
        int tab[7] = { 0 };
        for ( int i = 0; i < 7; ++i )
        	tab[i] = i;
     
        random_shuffle( tab, tab + 7 );
     
        for ( int i = 0; i < 7; ++i )
        	cout << tab[i] << endl;
    }
    [/code]

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il faut effectivement utiliser srand pour initialiser le générateur de nombres pseudos-aléatoires, et ta formule pour tirer un nombre entre 0 et 7 est erronnée.

    Jette un oeil à la FAQ C, tout y est expliqué.

    A part ça, random_shuffle est effectivement plus pratique dans ce cas précis, mais il faut bien garder en tête ce qu'il fait : il ne génère rien, il ne fait que réarranger aléatoirement les éléments d'un conteneur.

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour,
    Yves doit avoir raison, il faut utiliser la fonction "srand".
    Si je comprends bien le tableau ne doit pas comprendre de doublon, donc il ne doit pas y avoir deux mêmes entiers dans le tableau (c'est une fonction qu'on utilise souvent dans les jeux notammant le Master Mind, se souvient-on encore de ce jeu ? ). La seule manière de faire cela est de créer un tableau d'entiers de 0 à 6, dans l'ordre puis de mélanger aléatoirement ces entiers dans le tableau.

    J'ai fait fonctionner le petit programme suivant avec mon vieux Turbo C V1.1, tu peux t'en inspirer, il n'y aura pas grand chose à changer :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
     
    int main(void)
    {
       int i, j, tmp, tableau[7];
       time_t t;
     
       srand((unsigned) time(&t));
       for(i=0; i<7; i++)
           tableau[i]=i;
       //mélange des éléments du tableau
       for(i=0; i<7; i++)
           {
           j=rand() % 7; //nombre aléatoire entre 0 et 6
           tmp=tableau[i];  tableau[i]=tableau[j];  tableau[j]=tmp;
           }
       printf("\n");
       for(i=0; i<7; i++)
         printf("%d    ", tableau[i]);
       getch();
       return 0;
    }
    Bonne chance !


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Points : 86
    Points
    86
    Par défaut
    voici ce que je propose
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    #include<iostream>
    #include<ctime>
    using namespace std;
     
    bool nouveau(int a,int index, int array[])
    {
    	for(int i=0;i<=index;i++)
    	{
    		if(a == array[i])
    		{
    			return false;
    		}
    	}
    	return true;
    }
     
    int main()
    {
     
     
    	int array[7];
    	int number;
    	srand(time(NULL));
     
    	for(int i=0;i<7;)
    	{
    		number=rand()%7;
     
    		if(nouveau(number,i,array))
    		{
    			array[i]=number;
    			i++;
    		}
     
    	}
     
    	for(i=0;i<7;i++)
    	{
    		cout<< array[i]<<endl;
    	}
     
    	return 0;
    }

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Merci.
    Depuis, j'ai trouvé plusieurs façon de faire que vous pouvez consulter ici :
    http://iutinfo90.free.fr/viewtopic.php?t=186

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par Loulou24
    A part ça, random_shuffle est effectivement plus pratique dans ce cas précis, mais il faut bien garder en tête ce qu'il fait : il ne génère rien, il ne fait que réarranger aléatoirement les éléments d'un conteneur.
    C'est terrible les bonnes (efficaces, simples et concises) réponses sans code qui passent innaperçues ...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Points : 121
    Points
    121
    Par défaut
    Un petit commentaire trouvé dans le livre du créateur du C++ (cf Page 762), pour les fans du rand() :

    Pour générer un nombre aléatoire entre 0 et n-1, mieux vaut utiliser l'expression suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (double(rand())/RAND_MAX)*n
    plutôt que :

    Voilà .

Discussions similaires

  1. Remplir un tableau Chiffre par Chiffre
    Par Supay2905 dans le forum Débuter
    Réponses: 5
    Dernier message: 30/11/2013, 17h18
  2. Remplir un tableau avec 2 tables différentes
    Par cyrux dans le forum Langage
    Réponses: 15
    Dernier message: 30/07/2010, 09h37
  3. Réponses: 6
    Dernier message: 21/03/2007, 14h59
  4. [PHP-JS] Remplir un tableau javascript selon un tableau php
    Par jerome38000 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/01/2005, 14h02
  5. Tableau d'objets de type différents
    Par Hell dans le forum C++
    Réponses: 9
    Dernier message: 11/01/2005, 22h57

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