Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un peu d'aide requise sur un code

    30 mai 2006 à 13:18:32

    Bonjour a tous,
    Je suis nouveau sur le forum mais j'ai decouvert ce site ily a deja quelques temps. je prend deja quelques secondes pour remercier et feliciter les createurs des "tutoriaux" (pas sur que ca se dise).
    Bref...

    voila j'essai actuellement de coder une fonction qui assigne une valeur ( comprise entre 1 et "max" ) a 4 variables differentes.
    Je veux de plus que les 4 valeurs soient differentes, mais mon code n'a pas l'air de fonctionner, je ne sais pas pourquoi...
    Si quelqu'un pouvait m'aider, je lui en serai tres reconnaissant, et lui enverrai en guise de remerciements 3 chameaux, un brocoli et un anorak (Decathlon, valeur: 12 Euros 30). :p


    srand(time(0));

        for(i=1; i<5; i++)
        {
                 random[i]=(rand()%max)+1;
                 if((i>1) && (random[i]==random[i-1]))
                 {random[i]=(rand()%max)+1;
                 break;}
                 else if((i>2) && (random[i]==random[i-2]))
                 {random[i]=(rand()%max)+1;
                 break;}
                 else if((i>3) && (random[i]==random[i-3]))
                 {random[i]=(rand()%max)+1;
                 break;}
        }
    • Partager sur Facebook
    • Partager sur Twitter
      30 mai 2006 à 13:32:46

      Qu'est ce qu'on ferait pas pour 3 chameaux. :)
      Normalement avec ça tu as 4 nombres différents:

      #include <time.h>

      int main ( int argc, char** argv ) {
        int random[4] = {0};
        int i = 0, max = 50;
        srand(time(NULL));

        for(i=0; i<4; i++) {
          random[i]== (rand() % max)+1;
        }
      }
      • Partager sur Facebook
      • Partager sur Twitter
        30 mai 2006 à 14:08:06

        Qu'est-ce qui te prouve que les 4 nombres aléatoires seront différents ?
        Tu dois tester que le nombre aléatoire n'est pas déjà dans le tableau random[], et éventuellement relancer un tirage.
        • Partager sur Facebook
        • Partager sur Twitter
          30 mai 2006 à 14:19:31

          Tu as raison:
          #include <time.h>

          int main ( int argc, char** argv ) {
            int random[4] = {0};
            int i = 0, j = 0, max = 50;
            srand(time(NULL));

            for(i=0; i<4; i++) {
              random[i]== (rand() % max)+1;
              for (j=0; j=i-1; j++) {
                if (random[i] == random[j]) {
                  random[i]= (rand() % max)+1;
                }
              }
            }
          }


          LA ça doit être mieux
          • Partager sur Facebook
          • Partager sur Twitter
            30 mai 2006 à 14:28:14

            Pas mieux, tu as fait une boucle infinie, quand i = 0 ;)
            Et tu ne testes pas si le nouveau nombre aléatoire tiré n'est pas déjà dans le tableau.
            • Partager sur Facebook
            • Partager sur Twitter
              30 mai 2006 à 15:18:18

              Voila j'ai écrit ca vite fait je sais pas si ca marche merci de me confirmer, je ne peux pas compiler la je ne suis pas chez moi.


              void assigner_valeurs(long tab[], unsigned long taille_tab, unsigned long max_val_rnd){

                      unsigned long i,j;
                      long temp;
                      int present=0;

                      for(i=0;i<taille_tab;i++){
                              do{
                                      present=0;
                                      temp=(long)(rand()%(max_val_rnd)+1);
                                      for(j=0;((!present) && (j<i));j++){
                                              if(temp==tab[j]){
                                                      present=1;
                                              }
                                      }
                                      if(!present){
                                              tab[i]=temp;
                                      }
                              }while(present);
                      }

              }



              EDIT : Erreur corrigé, merci -Ed-
              • Partager sur Facebook
              • Partager sur Twitter
                30 mai 2006 à 16:01:44

                Citation : seb13

                Tu as raison:
                <...>
                LA ça doit être mieux


                Le mieux est de le vérifier... Marche pas.

                Pour tester l'algo, utiliser le pire cas (4/4)

                #include <stdio.h>
                #include <stdlib.h>
                #include <time.h>

                int is_in (int random[], size_t n, int x)
                {
                   int found = 0;
                   size_t i;
                   for (i = 0; !found && i < n; i++)
                   {
                      found = random[i] == x;
                   }
                   return found;
                }

                static void rnd (int random[], size_t n, int min, int max)
                {
                   size_t i;
                   for (i = 0; i < n; i++)
                   {
                      do
                      {
                         random[i] = (rand () % max) + min;
                      }
                      while (is_in (random, i, random[i]));
                   }
                }

                static void aff (int const random[], size_t n)
                {
                   size_t i;
                   for (i = 0; i < n; i++)
                   {
                      printf ("%4d", random[i]);
                   }
                   printf ("\n");
                }

                int main (int argc, char **argv)
                {
                   int random[4] =
                      {
                         0
                      };
                   srand ((unsigned) time (NULL));

                   for (;;)
                   {
                      rnd (random, sizeof random / sizeof *random, 1, 4);
                      aff (random, sizeof random / sizeof *random);
                      system("pause");
                   }
                   return 0;
                }


                1 4 2 3
                Appuyez sur une touche pour continuer...
                4 2 1 3
                Appuyez sur une touche pour continuer...
                3 2 4 1
                Appuyez sur une touche pour continuer...
                3 4 1 2
                Appuyez sur une touche pour continuer...
                3 4 1 2
                Appuyez sur une touche pour continuer...
                3 2 1 4
                Appuyez sur une touche pour continuer...
                1 4 3 2
                Appuyez sur une touche pour continuer...
                4 1 2 3
                Appuyez sur une touche pour continuer...
                4 3 1 2
                Appuyez sur une touche pour continuer...
                1 3 2 4
                Appuyez sur une touche pour continuer...
                4 3 2 1
                Appuyez sur une touche pour continuer...
                3 4 1 2
                Appuyez sur une touche pour continuer...
                3 2 1 4
                Appuyez sur une touche pour continuer...
                3 4 2 1
                Appuyez sur une touche pour continuer...^C
                • Partager sur Facebook
                • Partager sur Twitter
                Music only !
                  30 mai 2006 à 16:09:10

                  Désolé mais je ne suis pas chez moi donc pour tester c'est pas possible :(
                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 mai 2006 à 16:42:30

                    j'ai fini par trouver, mais merci pour votre aide!

                    la solution etait:


                        int random[5]={0,1,2,3,4);
                        int coin[5];
                        int max=4;
                        int i;
                       
                        srand(time(0));
                       

                        for(i=1; (i<5) ; i++)
                        {
                                 random[i]=(rand()%max)+1;
                                 
                                 if((i>1)&&(random[i]==random[i-1]))
                                 i=1;
                                 if((i>2)&&(random[i]==random[i-2]))
                                 i=1;
                                 if((i>3)&&(random[i]==random[i-3]))
                                 i=1;

                        }
                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 mai 2006 à 16:43:24

                      met ton topic résolu ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        30 mai 2006 à 19:00:19

                        Encore moi, juste petite chose : je crois que ceci donne une valeur comprise entre min et min+(max-1) les 2 bornes étant comprises. En effet rand()%max donne une valeur comprise entre 0 et (max-1) compris. Ensuite on décale de min.

                        random[i] = (rand () % max) + min;


                        Pour avoir un nombre aléatoire compris entre min et max bornes comprises, je vois plutot un truc du genre :
                        random[i] = (rand () % (max-min+1)) + min;


                        EDIT : Apres test ce deuxieme résultat marche comme souhaité. (testé sur ton algo -ed-)


                        int main (int argc, char **argv)
                        {
                           int random[4] =
                              {
                                 0
                              };
                           srand ((unsigned) time (NULL));

                           for (;;)
                           {
                              rnd (random, sizeof random / sizeof *random, 2, 5);
                              aff (random, sizeof random / sizeof *random);
                              system("pause");
                           }
                           return 0;
                        }


                        Resultat :
                        2 4 3 5
                        4 2 5 3
                        etc...

                        EDIT2 : Je viens de trouver un tuto sdz qui explique un peu plus en détail les nombres aléatoires. Ca confirme ma formule semble t-il.

                        http://www.siteduzero.com/tuto-3-2426-1-les-nombres-aleatoires-en-c-c.html
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Un peu d'aide requise sur un code

                        × 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