Partage
  • Partager sur Facebook
  • Partager sur Twitter

Générer des nombres aléatoires différents dans C

    18 février 2018 à 16:11:56

    Bonjour, 

    Tout d'abord je viens remercier la personne qui m'avait répondu sur mon précédent message. J'ai eu un petit soucis en modifiant le message pour afficher les couleurs du code, celui-ci a été considéré comme un spam et a été supprimé... Donc je recommence ici.

    Voilà, je débute en programmation C dans le cadre de mon master. Je n'ai aucune base. Mon enseignant me demande d'écrire un programme pour générer au hasard trois entiers différents dans [5, 10] et d'afficher ces trois nombres dans l’ordre croissant. Je crois avoir tout fait mais je me retrouve parfois avec 2 nombres identiques et je ne peux donc pas les classer... Quelqu'un saurait-il comment arranger ça ? Mercii :)

    Voilà mon programme : 

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(void){
    	int i = 0;
    	int MAX = 10;
    	int MIN = 5;
    	int a = 0;
    	int b = 0;
    	int c = 0;
    	srand(time(NULL)); // initialisation de rand
    
    for(i=0; i<1; i++){
    	a = (rand() % (MAX - MIN + 1)) + MIN;
    	b = (rand() % (MAX - MIN + 1)) + MIN;
    	c = (rand() % (MAX - MIN + 1)) + MIN;
            printf("%d %d %d",a, b, c);}
     
    if (a < b && b < c) {
            printf("\n%d < %d < %d", a, b, c);}
    
        else if (b < a && a < c) {
            printf("\n%d < %d < %d", b, a, c);}
    
        else if (c < b && b < a) {
            printf("\n%d < %d < %d", c, b, a);}
    
        else if (b < c && c < a) {
            printf("\n%d < %d < %d", b, c, a);}
    
        else if (c < a && a < b) {
            printf("\n%d < %d < %d", c, a, b);}
    
        else if (a < c && c < b) {
            printf("\n%d < %d < %d", a, c, b);}
    
        return 0; }
    



    • Partager sur Facebook
    • Partager sur Twitter
      18 février 2018 à 17:44:27

      Hello,

      JohannaAmbu a écrit:

      la personne qui m'avait répondu sur mon précédent message

      Ma pomme.

      Voilà mon programme : 

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      int main(void){
      	int i = 0;
      	int MAX = 10;
      	int MIN = 5;
      	int a = 0;
      	int b = 0;
      	int c = 0;
      	srand(time(NULL)); // initialisation de rand
      
      for(i=0; i<1; i++){
      	a = (rand() % (MAX - MIN + 1)) + MIN;
      	b = (rand() % (MAX - MIN + 1)) + MIN;
      	c = (rand() % (MAX - MIN + 1)) + MIN;
              printf("%d %d %d",a, b, c);}
       
      if (a < b && b < c) {
              printf("\n%d < %d < %d", a, b, c);}
      
          else if (b < a && a < c) {
              printf("\n%d < %d < %d", b, a, c);}
      
          else if (c < b && b < a) {
              printf("\n%d < %d < %d", c, b, a);}
      
          else if (b < c && c < a) {
              printf("\n%d < %d < %d", b, c, a);}
      
          else if (c < a && a < b) {
              printf("\n%d < %d < %d", c, a, b);}
      
          else if (a < c && c < b) {
              printf("\n%d < %d < %d", a, c, b);}
      
          return 0; }
      



      Si tu n'as aucune base, il y a la solution brute. Heureusement il n'y a que 3 nombres, sinon il faudrait passer à une autre méthode - de même que pour le tri !

      a=rand()....;
      
      do {
          b=rand()....;
      } while(b==a);
      
      do {
          c=rand()....;
      } while(c==a || c==b);


      -
      Edité par edgarjacobs 18 février 2018 à 17:53:53

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        18 février 2018 à 17:53:03

        Merci pour tes réponses :) J'étais en train de tester ta première méthode avec le tableau. J'ai fais ça : 

        #include <stdio.h>
        #include <stdlib.h>
        #include <time.h>
        
        int main(void){
        
        int tab[6]={5,6,7,8,9,10}, i = 0;
        srand(time(NULL)); // initialisation de rand
        
        for(i=0; i<3; i++){
           tab[i] = 5 + rand()%6;
           printf("%d\n", tab[i]);}
        
        
        return 0;}



        Je n'arrive toujours pas à obtenir 2 nombres différents... 

        -
        Edité par JohannaAmbu 18 février 2018 à 17:56:12

        • Partager sur Facebook
        • Partager sur Twitter
          18 février 2018 à 17:58:02

          Re,-

          Ton code est un bon début, mais la boucle c'est

          for(i=0;i<....;i++) {
              int j;
              j=rand()%6;    // 6: nombre de cases du tableau
              inverser tab[i] et tab[j]
          }
          
          // affiche les nombres
          for(i=0;i<....;i++)
              printf("%d\n",tab[i]);
          
          // et maintenant, il faut trier tab[0], tab[1] et tab[2]

          -
          Edité par edgarjacobs 18 février 2018 à 18:04:59

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            18 février 2018 à 18:07:44

            Ah super merci beaucoup !! J'étais quand même loin du but ^^ 

            J'ai tenté 1 million de fois de changer des choses dans mon code mais je ne parviens toujours pas à trouver la solution. J'ai réussi à trouver et comprendre comment on classe les cases du tableau dans l'ordre croissant avec 1 programme. Mon programme permettait de prendre au hasard 3 nombres différents. Et en combinant les deux je n'arrive pas à classer mes 3 nombres dans l'ordre croissant. J'obtiens toutes les cases de mon tableau de 6 cases + les 3 nombres aléatoire. 

            J'ai donc réessayé en mixant les deux programmes mais ça ne fonctionne pas du tout...

            Ca me rend folle Aaaahh !!! 

            #include <stdio.h>
            #include <stdlib.h>
            #include <time.h>
            
            
            void ordonner(int *tableau, int taille); // PROTOTYPE FONCTION
            
            int main()
            {
                srand(time(NULL));
                int tab[6] = {5, 6, 7, 8, 9, 10};
                ordonner(tab,3);
                int j;
                j=rand()%6;
            
            
            return 0;
            }
            
            
            void ordonner(int *tableau, int taille) // FONCTION : ORDONNER DE MANIÈRE CROISSANTE
            
                int i;
                int tri =0;
                for (i=0 ; i < taille ; i++)
            
                {
                    if (tab[i] > tab[i+1])
                    {
                        tri = tab[i+1];
                        tab[i+1] = tab[i];
                        tab[i]= tri;
            
                    }
            
                     printf("%d \n", tab[i]);
                }
            



            -
            Edité par JohannaAmbu 18 février 2018 à 20:06:18

            • Partager sur Facebook
            • Partager sur Twitter
              19 février 2018 à 0:38:57

              Hello,

              Tu as pas mal d'algorithmes de tri, le tri par insertion est simple à programmer (ce n'est qu'un exemple, d'autres ici).

              Je te signale qu'ordonner quelque chose d'ordonné ne donne pas un résultat probant.... ;)

              -
              Edité par edgarjacobs 19 février 2018 à 0:39:48

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                19 février 2018 à 11:40:28

                CA Y EST !!!! Ouiiiiiiiiiii !!! J'ai réussi hihihihi. Je pense que mon code est bon. Peux-tu me dire si tu trouves des choses pas trop bonnes s'il te plaît ? Merci beaucoup pour ton aide en tout cas, c'est super gentil :)

                #include <stdio.h>
                #include <stdlib.h>
                #include <time.h>
                
                int main(void) {
                
                srand(time(NULL));
                int tab[6]={5,6,7,8,9,10};
                int i=0;
                int j=0;
                int tri=0;
                int tmp=0;
                
                for(i=0;i<3;i++) {
                    j=rand()%6;
                    tri = tab[j];
                    tab[j] = tab[i];
                    tab[i] = tri; }
                
                for(i=0;i<3;i++)
                {
                    for(j=0;j<3;j++)
                    {
                        if(tab[i]<tab[j])
                        {
                            tmp=tab[j];
                            tab[j]=tab[i];
                            tab[i]=tmp;
                        }
                    }
                }
                
                for(i=0;i<3;i++) {
                    printf("%d\n",tab[i]); }
                
                return 0; }

                -
                Edité par JohannaAmbu 19 février 2018 à 11:59:13

                • Partager sur Facebook
                • Partager sur Twitter
                  19 février 2018 à 14:54:39

                  Hello,

                  Bien vu :)

                  Points de détail:

                  • la ligne 11 serait bien mieux après la ligne 14, et tri ne doit pas être initiallisé
                  • la ligne 12 idem mais après 25, idem pour l'initialisation
                  • pourquoi initialiser i et j lignes 9 et 10 ? c'est fait en lignes 14 et 15, 20 et 22, et 33
                  • un peu de constance dans le positionnement des accolades: choisis ton style une fois pour toute. Dans ton cas (c-à-d à choisir entre les deux styles que tu utilises), je préfère le style utilisé pour les lignes 20 à 31.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                    21 février 2018 à 9:43:09

                    Merci beaucoup pour ton aide ! Je vais corriger tout ça et mes autres exercice par la même occasion :D 

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Générer des nombres aléatoires différents dans C

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown