Partage
  • Partager sur Facebook
  • Partager sur Twitter

Choisir un nombre aléatoirement à un tableau

    24 février 2022 à 21:14:41

    Bonjour, je souhaite écrire une fonction qui recherche un entier dans tableau. L’entier recherché et le tableau sont passés en paramètre.

    Voici ma démarche pour réaliser cette fonction mais ça ne fonctionne pas. De plus ce que j'ai essayé de réaliser n'est pas très concis ni très efficace.

    Avez-vous une idée pour m'aider ?  

    int nbMagique (int *nMagic, int tab[])
    {
        srand(time(NULL));
        *nMagic = rand();
        printf("le nombre magique est %f\n", nMagic);
        while ((*nMagic)!=tab)
        {
            *nMagic=rand()%1000;
        }
        printf("le nombre magique est %d\n", *nMagic);
    
        return *nMagic;
    }
    



    -
    Edité par Romain11111 25 février 2022 à 13:50:26

    • Partager sur Facebook
    • Partager sur Twitter
      24 février 2022 à 21:34:42

      /!\ Attention le PO a modifié son code !

      Ligne 5 : tu essaies d'afficher un pointeur en tant que float ! Le résultat risque d’être loin de ce que tu souhaites !

      Ligne 6 tu compares un float avec un pointeur ! Ce ne sont pas des choses comparable !

      srand ne doit être appelé qu'une seule fois durant l'exécution du programme ! Il n'a donc rien a faire dans la fonction !

      RomainThepaut a écrit:

      je souhaite écrire une fonction qui recherche un entier dans tableau. L’entier recherché et le tableau sont passés en paramètre.

      Que viennent faire les nombres aléatoires pour chercher un entier dans un tableau ?

      Pourquoi des float, si tu recherche un entier ?

      -
      Edité par rouIoude 25 février 2022 à 14:08:21

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        25 février 2022 à 1:45:04

        Ça serait une façon originale de tester une fonction qui recherche une valeur dans un tableau:
        int valeur = recherche(tableau, tableau[rand()%(sizeof(tableau)/sizeof(int))]);
        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          25 février 2022 à 13:59:30

          rouIoude a écrit:

          Ligne 5 : tu essaies d'afficher un pointeur en tant que float ! Le résultat risque d’être loin de ce que tu souhaites !

          Ligne 6 tu compares un float avec un pointeur ! Ce ne sont pas des choses comparable !

          srand ne doit être appelé qu'une seule fois durant l'exécution du programme ! Il n'a donc rien a faire dans la fonction !

          RomainThepaut a écrit:

          Effectivement je me suis embrouillé dans mon énoncé avec un exercice que j'ai fait précédemment. J'ai rectifié mon code car oui, chercher un entier parmi des réels c'est totalement faux. 

          Justement, la ligne 6 de la boucle while est celle qui me bloque car je ne sais pas comment faire pour que le programme choisisse un entier (parmi le tableau d'entier que l'utilisateur aura saisi). 

          Mon idée était que le programme choisisse aléatoirement un entier et que Tant Que cet entier n'appartient pas au tableau alors il choisit un nouvel entier et ainsi de suite jusqu'à ce que l'entier choisit appartienne au tableau. 

          • Partager sur Facebook
          • Partager sur Twitter
            25 février 2022 à 14:15:12

            RomainThepaut a écrit:

            Effectivement je me suis embrouillé dans mon énoncé avec un exercice que j'ai fait précédemment. J'ai rectifié mon code car oui, chercher un entier parmi des réels c'est totalement faux...

            Bon, donne l’énoncé correct, car je n'ai toujours pas compris ce que vient faire l’aléatoire dans ton code ?  

            Pour ton code mes premières remarques sont toujours valable :

            Ligne 5 : tu essaies d'afficher un pointeur sur un int en tant que float ! Le résultat risque d’être loin de ce que tu souhaites !

            Ligne 6 tu compares un int avec un pointeur ! Ce ne sont pas des choses comparable !

            srand ne doit être appelé qu'une seule fois durant l'exécution du programme ! Il n'a donc rien a faire dans la fonction !

            Mais tu n'en a pas tenu compte !!!




            • Partager sur Facebook
            • Partager sur Twitter
            ...
              25 février 2022 à 14:28:00

              rouIoude a écrit:

              Bon, donne l’énoncé correct, car je n'ai toujours pas compris ce que vient faire l’aléatoire dans ton code ?  

              Pour ton code mes premières remarques sont toujours valable :

              Ligne 5 : tu essaies d'afficher un pointeur sur un int en tant que float ! Le résultat risque d’être loin de ce que tu souhaites !

              Ligne 6 tu compares un int avec un pointeur ! Ce ne sont pas des choses comparable !

              srand ne doit être appelé qu'une seule fois durant l'exécution du programme ! Il n'a donc rien a faire dans la fonction !

              Mais tu n'en a pas tenu compte !!!

              Si j'en ai tenu compte, j'ai modifié mon programme pour essayer que ça marche. Le voici ci-joint. 

              L'objectif : je souhaite que le programme choisisse aléatoirement un entier parmi un tableau (que j'ai passé en paramètre) que l'utilisateur aura saisi préalablement. 

              int nbMagique (int *nMagic, int tab[])
              {
                  int i=0;
                  srand(time(NULL));
                  *nMagic = rand()%100;
                  printf("le nombre magique est %d\n", *nMagic);
                  while (i<TAILLE && *nMagic!=tab[i])
                  {
                      srand(time(NULL));
                      *nMagic=rand()%100;
                  }
                  printf("le nombre magique est %d\n", *nMagic);
              
                  return *nMagic;
              }
              








              -
              Edité par Romain11111 25 février 2022 à 14:31:01

              • Partager sur Facebook
              • Partager sur Twitter
                25 février 2022 à 14:41:24

                RomainThepaut a écrit:

                Si j'en ai tenu compte, 

                Maintenant oui ! sauf pour le srand ! Tu en a même rajouté un deuxième ! C'est donc encore pire !

                RomainThepaut a écrit:

                L'objectif : je souhaite que le programme choisisse aléatoirement un entier parmi un tableau que l'utilisateur aura saisi préalablement. 

                Ok, c'est déjà plus clair ! 

                Donc dans ce cas tu tires au sort un indice dans la plage du tableau, et tu retournes la valeur correspondant à cet indice du tableau ! C'est pas plus compliqué ! Pas besoin de boucle !

                Les paramètre de la fonction devrait être le tableau et sa taille ! Il est inutile de passer un pointeur pour récupérer la valeur. La retourner est suffisant !



                • Partager sur Facebook
                • Partager sur Twitter
                ...
                  25 février 2022 à 14:53:00

                  rouIoude a écrit:

                  Maintenant oui ! sauf pour le srand ! Tu en a même rajouté un deuxième ! C'est donc encore pire !

                  Ok, c'est déjà plus clair ! 

                  Donc dans ce cas tu tires au sort un indice dans la plage du tableau, et tu retournes la valeur correspondant à cet indice du tableau ! C'est pas plus compliqué ! Pas besoin de boucle !

                  Les paramètre de la fonction devrait être le tableau et sa taille ! Il est inutile de passer un pointeur pour récupérer la valeur. La retourner est suffisant !

                  Tirer un indice du tableau et retourner sa valeur, je n'y avait pas pensé c'est une superbe idée. Merci

                  Pourrais-tu m'en dire plus sur ma mauvaise utilisation du srand(time(NULL)) ? 





                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 février 2022 à 15:26:42

                    rouIoude a écrit:

                    srand ne doit être appelé qu'une seule fois durant l'exécution du programme ! Il n'a donc rien a faire dans la fonction !

                    Il sert à initialiser le générateur de nombre aléatoire, c'est pour cela qu'il faut l'appeler qu'une seul fois durant l'exécution de tout le programme ! Je ne vais pas rentrer dans les détails, il y a beaucoup de lecture sur le web à ce sujet !
                    C'est rand qui tire les nombre aléatoire !

                    Ne mets pas le texte de tes écrit en commentaire, ça rend le post difficile à lire !

                    • Partager sur Facebook
                    • Partager sur Twitter
                    ...
                      25 février 2022 à 15:38:07

                      Hello,

                      Prenons le problème à l'envers. Si tu code ceci

                      #include <stdio.h>
                      #include <stdlib.h>
                      
                      
                      int main(void) {
                      	for(int i=0;i<10;i++)
                      		printf("%d\n",rand());
                      	
                      	return(0);
                      }

                      et que tu exécutes le programme, tu auras toujours les même nombres. Pourquoi ? Car la "graine" qui initialise le générateur de nombres aléatoires est la même. Pour initialiser la "graine" de départ, on fait un srand(time(NULL)). On emploie time(NULL) car c'est (toutes les secondes) un nombre différent. On pourrait employer n'importe quelle fonction qui ne donne (que rarement) la même graine (getpid() par exemple sous linux). Et lorsque la graine a été initialisée, plus besoin de le refaire, une fois par exécution suffit.

                      -
                      Edité par edgarjacobs 25 février 2022 à 15:40:28

                      • 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

                        25 février 2022 à 15:40:57

                        voici ce que j'ai donc fait au final : (cela fonctionne)

                        int nbMagique (int nMagic, int tab[])
                        {
                            int sol=0;
                            srand(time(NULL));
                            nMagic = rand()%100;
                            sol=tab[nMagic];
                        
                            return sol;
                        }



                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 février 2022 à 15:49:13

                          C'est mieux, mais c'est inutile de passer nMagic en paramètre de la fonction, vu que tu ne fait rien de la valeur reçu ! (Peut-être une petite révision sur les fonctions est à prévoir) ?

                          C'est plutôt la taille du tableau qu'il faudrait passer, car ta fonction ne fonctionne que pour des tableaux de 100 int !

                          Pour le srand, je capitule ! Tu verras ça quand tu sera plus grand !

                          • Partager sur Facebook
                          • Partager sur Twitter
                          ...
                            25 février 2022 à 15:57:39

                            edgarjacobs a écrit:

                            Hello,

                            Prenons le problème à l'envers. Si tu code ceci

                            #include <stdio.h>
                            #include <stdlib.h>
                            
                            
                            int main(void) {
                            	for(int i=0;i<10;i++)
                            		printf("%d\n",rand());
                            	
                            	return(0);
                            }

                            et que tu exécutes le programme, tu auras toujours les même nombres. Pourquoi ? Car la "graine" qui initialise le générateur de nombres aléatoires est la même. Pour initialiser la "graine" de départ, on fait un srand(time(NULL)). On emploie time(NULL) car c'est (toutes les secondes) un nombre différent. On pourrait employer n'importe quelle fonction qui ne donne (que rarement) la même graine (getpid() par exemple sous linux). Et lorsque la graine a été initialisée, plus besoin de le refaire, une fois par exécution suffit.

                            -
                            Edité par edgarjacobs il y a moins de 30s

                            Merci de ton explication. Je pense avoir compris !

                            • Partager sur Facebook
                            • Partager sur Twitter
                              25 février 2022 à 16:44:48

                              Si tu as compris pourquoi n'utiliser la fonction srand() qu'une seule fois, ta fonction peut s'écrire
                              int nbMagique(int nelem,int tab[]) {
                                  return(tab[rand()%nelem]);
                              }
                              

                              -
                              Edité par edgarjacobs 25 février 2022 à 16:46:38

                              • 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

                                25 février 2022 à 18:49:29

                                Il faudrait peut-être que tu reformules autrement ce que tu veux réellement faire.
                                On pourra mieux te guider.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Le Tout est souvent plus grand que la somme de ses parties.

                                Choisir un nombre aléatoirement à un tableau

                                × 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