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 :

Affichage nombre aléatoire


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut Affichage nombre aléatoire
    Bonjour,

    Je cherche à couvrir chaque nombre allant de 1 à 100.

    J'utilise cette solution qui est loin d'être optimale car je pourrais pas couvrir tous les nombres (le tirage pouvant être redondant)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int i;
    srand(time(NULL));
    for (i = 0; i < 99; i++)
    {
    		num = (rand() % 99) + 1;
       		printf("Nombre %02d\n",num);  		
    }
    J'ai pensé ensuite une fonction aléatoire de ce type :

    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
     
    void aleatoire()
    {
    	int i1,i2,i3,i4, i5;
        srand (time (NULL));
     
        i1=(rand() % 99) + 1;
        do{
            i2=(rand() % 99) + 1;
          }while(i2==i1);
        do{
            i3=(rand() % 99) + 1;
          }while(i3==i1 || i3==i2);
        do{
            ch4=(rand() % 99) + 1;
          }while(i4==i1 || i4==i2 || i4==i3);
    	do{
            ch5=(rand() % 99) + 1;
          }while(i5==i1 || i5==i2 || i5==i3 || i5==i4);
        printf("Nombre 1: %d\nNombre 2: %d\nNombre 3: %d\nNombre 4: %d\nNombre 5: %d\n",i1,i2,i3,i4,i5);
    }
    Cela marche bien pour 5 nombres mais cela devient très vite une usine à gaz si je dois traiter 100 entiers de 1 à 100.

    Existe-t-il une solution plus simple de répondre à mon besoin ?

    Merci bien pour vos contributions.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tu as une solution bourrine : tu stockes les nombres dans un tableau, et à chaque tirage aléatoire tu vérifies s'il n'y est pas déjà. Je sais, c'est pas intelligent, c'est pas optimisé, à la fin tu risques de faire 200 tirages juste parce qu'il te manque le 53, mais avec les bécanes d'aujourd'hui, ça passera.

    Tu as une solution élégante : tu rentres tes nombres de 1 à 100 dans un tableau dans l'ordre, puis tu les mélanges. Comment ? Tu fais un certain nombre de permutations d'éléments 2 à 2, dont l'indice dans le tableau est tiré aléatoirement. Du coup tu t'en fout si tu tires deux fois le même nombre. Déjà il faudrait un gros coup de bol pour tirer deux fois la même paire de nombres.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut
    Merci pour cette réponse complète. J'ai essayé le code suivant mais j'ai quand même une redondance des nombres même si les paires sont différentes.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    void permute (int tab[], int i, int j);
     
    int main (void)
    {
       int i, j, k;
       int num[99];
       srand((unsigned) time(NULL)); 
     
       for (i = 1; i <= 100; i++)
       {
          num[i] = i;
       }
     
       for (i = 1; i <= 100; i++)
       {
       	j = (rand() % 99) + 1;
       	k = (rand() % 99) + 1;
       	//printf("j = %d | k = %d\n", j, k);
       	permute(num, j, k);
     
    	printf ("%d \n", num[i]);
    }	
       printf ("\n");
       return 0;
    }
     
    void permute (int tab[], int i, int j) 
    {
      int temp; 
     
      /* permutation des elements d'indices i et j */
      temp = tab[i];
      tab[i] = tab[j];
      tab[j] = temp;
    }

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Il ne faut pas lire le resultat dans la boucle ou tu melange, mais lire le tableau une fois mélangé.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut
    Autant pour moi, effectivement, merci Lucien63.

  6. #6
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par sneakz Voir le message
    Merci pour cette réponse complète. J'ai essayé le code suivant mais j'ai quand même une redondance des nombres même si les paires sont différentes.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    void permute (int tab[], int i, int j);
     
    int main (void)
    {
       int i, j, k;
       int num[99];
       srand((unsigned) time(NULL)); 
     
       for (i = 1; i <= 100; i++)
       {
          num[i] = i;
       }
     
       for (i = 1; i <= 100; i++)
       {
       	j = (rand() % 99) + 1;
       	k = (rand() % 99) + 1;
       	//printf("j = %d | k = %d\n", j, k);
       	permute(num, j, k);
     
    	printf ("%d \n", num[i]);
    }	
       printf ("\n");
       return 0;
    }
     
    void permute (int tab[], int i, int j) 
    {
      int temp; 
     
      /* permutation des elements d'indices i et j */
      temp = tab[i];
      tab[i] = tab[j];
      tab[j] = temp;
    }
    Les tableaux en C sont indicés de 0 à n-1.
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Points : 83
    Points
    83
    Par défaut
    un rand()%99 + 1 te donnera un nombre entre 1 et 99

    pour avoir entre 1 et 100 il faut faire rand()%100 + 1

  8. #8
    Invité(e)
    Invité(e)
    Par défaut
    A noter, pour avoir un meilleur aléa : http://c.developpez.com/faq/?page=no..._random_bornes.

Discussions similaires

  1. p'tite question de cryptage ( nombre aléatoire )
    Par smyley dans le forum Algorithmes et structures de données
    Réponses: 53
    Dernier message: 08/11/2004, 10h07
  2. Nombres aléatoires
    Par Mat 74 dans le forum Assembleur
    Réponses: 20
    Dernier message: 29/08/2004, 13h31
  3. recherche algo de génération de nombre aléatoire
    Par Pascale38 dans le forum MFC
    Réponses: 2
    Dernier message: 26/01/2004, 14h20
  4. Nombre aléatoire en SQL
    Par sqlnet dans le forum Langage SQL
    Réponses: 8
    Dernier message: 19/08/2003, 12h38
  5. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30

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