Partage
  • Partager sur Facebook
  • Partager sur Twitter

utilisation de de fonction pour comparer 2 variables

probleme apres la compilation

    9 août 2006 à 1:32:47

    bonjour tout le monde , je viens poser une petite question a propos de mon code , il a pour but de trouver un nombre mystere généré aléatoirement , cependant j ai essayé de creer 2 fonctions séparées de main qui feraient leur boulot : comparer les 2 variables et générer un nombre aléatoirement

    voici le code :

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



    void compareNombres(long nombreMystere , long nombreEntre)

    {
         
     if (nombreEntre > nombreMystere)
     {
                     printf("c est plus petit\n");
    }
      else if (nombreEntre < nombreMystere)
      {
           printf("c est plus grand\n");
    }
      else
      {
          printf(" bravo , vous avez trouvé le nombre mystere");
         
          }
                             
    }
    long genereNombre(long MIN , long MAX)
    {
      long nombreGenere;
      srand(time(NULL));
      nombreGenere = (rand() % (MAX - MIN + 1)) + MIN;
       
      return nombreGenere;
    }

    int main ( int argc, char** argv )
    {
        long nombreMystere = 0, nombreEntre = 0;
        long MAX = 100, MIN = 1;

        // Génération du nombre aléatoire
        nombreMystere = genereNombre(MIN, MAX);

        /* La boucle du programme. Elle se répète tant que l'utilisateur
        n'a pas trouvé le nombre mystère */


        do
        {
            // On demande le nombre
            printf("Quel est le nombre ? ");
            scanf("%ld", &nombreEntre);

            // On compare le nombre entré avec le nombre mystère
            compareNombres(nombreEntre, nombreMystere);

        } while (nombreEntre != nombreMystere);


        system("PAUSE");
    }


    la compilation a lieu et l executable se lance , par contre la fonction compareNombres semble ne pas marcher o_O j ai essayé de changer les valeurs MIN et MAX et il s avere que ce n est pas la fonction genereNombre qui a un probleme , voila si vous pouviez m aider ..

    Merci d avance.
    • Partager sur Facebook
    • Partager sur Twitter
      9 août 2006 à 2:01:06

      On le repetera jamais assez, faire un modulo sur un rand ne génère pas un nombre aléatoire car certains nombres sont de ce fait *favorisés* .

      Mais ce qui ne va pas c'est:
      compareNombres(nombreEntre, nombreMystere);
      alors que tu as définie:
      void compareNombres(long nombreMystere , long nombreEntre)

      Vois-tu l'inversion des paramètres ?
      • Partager sur Facebook
      • Partager sur Twitter
        9 août 2006 à 2:08:42

        ah oui effectivement , je pensais pourtant avoir changé ca ... pour la génération du nombre aléatoire que me conseille tu?

        et pourquoi favorise il certains nombres?

        en tout cas merci ca fonctionne ^^

        le code pour les intéressés

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

        void compareNombres(long nombreEntre , long nombreMystere)

        {
             
         if (nombreEntre > nombreMystere)
         {
                         printf("c est plus petit\n");
        }
          else if (nombreEntre < nombreMystere)
          {
               printf("c est plus grand\n");
        }
          else
          {
              printf(" bravo , vous avez trouve le nombre mystere\n");
             
              }
                                 
        }
        long genereNombre(long MIN , long MAX)
        {
          long nombreGenere;
          srand(time(NULL));
          nombreGenere = (rand() % (MAX - MIN + 1)) + MIN;
           
          return nombreGenere;
        }




        int main ( int argc, char** argv )
        {
            long nombreMystere = 0, nombreEntre = 0;
            long MAX = 100, MIN = 1;

            // Génération du nombre aléatoire
            nombreMystere = genereNombre(MIN, MAX);

            /* La boucle du programme. Elle se répète tant que l'utilisateur
            n'a pas trouvé le nombre mystère */


            do
            {
                // On demande le nombre
                printf("Quel est le nombre ? ");
                scanf("%ld", &nombreEntre);

                // On compare le nombre entré avec le nombre mystère
                compareNombres(nombreEntre, nombreMystere);

            } while (nombreEntre != nombreMystere);


            system("PAUSE");
        }

        • Partager sur Facebook
        • Partager sur Twitter
          9 août 2006 à 9:35:40

          Citation : Jaune


          long genereNombre (long MIN , long MAX)
          {
            long nombreGenere;
            srand(time(NULL));
            nombreGenere = (rand() % MAX - MIN + 1)) + MIN;
             
            return nombreGenere;
          }

          En dehors du problème signalé, il faut aussi rappeler que srand() ne doit être appelé qu'une seule fois au début du programme.
          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
            9 août 2006 à 12:59:07

            merci -ed- je ne comprenais pas pourquoi je n arrivais pas a mettre la fonction genereNombre dans un autre fichier source (ca y est je suis passé aux headers :p), voila la réponse a ma question sans même l avoir posée ^^ j ai juste déplacé le srand au début de la fonction main , c est bien la meilleure chose a faire ?
            • Partager sur Facebook
            • Partager sur Twitter
              9 août 2006 à 13:32:03

              Pourquoi ta fonction ne génère pas des nombres aléatoires

              La raison est très simple mais pas forcemment facile à saisir:
              rand() génère un nombre aléatoire entre 0 et RAND_MAX (compris il me semble) .
              Cette génération est supposé vraiment aléatoire .
              Pour montrer que:
              nombreGenere = (rand() % (MAX - MIN + 1)) + MIN;


              ne génère pas de nombre aléatoire, nous allons prendre un exemple:
              RAND_MAX=9
              MIN=0
              MAX=5

              Voilà donc un tableau de résultats:

              rand() => nombreGenere
              ----------------------
              0 => 0%(5-0+1)+0=0
              1 => 1%(5-0+1)+0=1
              2 => 1%(5-0+1)+0=2
              3 => 3%(5-0+1)+0=3
              4 => 4%(5-0+1)+0=4
              5 => 5%(5-0+1)+0=5
              6 => 6%(5-0+1)+0=0
              7 => 7%(5-0+1)+0=1
              8 => 8%(5-0+1)+0=2
              9 => 9%(5-0+1)+0=3
              On remarque que les nombres 0,1,2,3 ont une probabilité plus élevée que 4 et 5

              Comment faire donc ?
              Il faut(selon moi) faire çà:

              float r=(float)rand();
              float ratio=r/(float)RAND_MAX;// ce nombre est compris entre 0 et 1
              ratio*=MAX-MIN;
              int nb=MIN+(int)ratio;

              Ainsi,
              si r=0, nb=MIN+0=MIN
              si r=RAND_MAX => ratio=1.0 => ratio=MAX-MIN => nb=MIN+(MAX-MIN)=MAX

              Cette génération est presque aléatoire puisque tous les nombres ont la même probabilité SAUF MAX car nb=MAX si et seulement si r=RAND_MAX .
              Pour bien faire, si rand()=RAND_MAX, alors on réappèle rand().
              Cela donne:

              int rand_int(intn MIN,int MAX)
              {
                  int r,nb;
                  float r2,ratio;

                  while((r=rand())==RAND_MAX)
                      ;

                  float r2=(float)r;
                  float ratio=r/(float)RAND_MAX;// ce nombre est compris entre 0 et 1
                  ratio*=MAX-MIN;
                  int nb=MIN+(int)ratio;
                  return nb;
              }
              • Partager sur Facebook
              • Partager sur Twitter
                10 août 2006 à 12:21:10

                Citation : Jaune

                merci -ed- je ne comprenais pas pourquoi je n arrivais pas a mettre la fonction genereNombre dans un autre fichier source (ca y est je suis passé aux headers :p), voila la réponse a ma question sans même l avoir posée ^^ j ai juste déplacé le srand au début de la fonction main , c est bien la meilleure chose a faire ?


                Les problèmes de compilation, c'est autre chose. (Manque un header, comme <time.h>, par exemple...

                L'emplacement de srand() influence le comportement du programme, pas la compilation (du moins, pas directement).
                • Partager sur Facebook
                • Partager sur Twitter
                Music only !

                utilisation de de fonction pour comparer 2 variables

                × 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