Partage
  • Partager sur Facebook
  • Partager sur Twitter

chaine aléatoire à partir d'une autre

Sujet résolu
    26 novembre 2020 à 15:31:09

    Bonjour,

    je suis débutant en programmation C, je cherche à faire plusieurs chaines aléatoires former à partir d'une autre chaine qui est elle connue.

    la chaîne connue est : 

    char pioche[103]="AAAAAAAAABBCCDDDEEEEEEEEEEEEEEEFFGGHHIIIIIIIIJKLLLLLMMMNNNNNNOOOOOOPPQRRRRRRSSSSSSTTTTTTUUUUUUVVWXYZ??";

    Je ne vois pas comment faire, quelqu'un pourrait-il m'aider ?

    • Partager sur Facebook
    • Partager sur Twitter
      26 novembre 2020 à 15:39:03

      Bonjour,

      Pour mélanger un tableau il n'y a qu'un réflexe à avoir : algorithme de Fisher Yates.

      Maintenant quelques remarques :

      • au scrabble ce ne sont pas des lettres que l'on manipule mais des jetons qui valent des points sur lesquels il y a des lettres mais pas tout le temps (joker) mais une fois sur le plateau il valent tous une lettre aussi ;
      • le sac dans lequel tu pioches doit pouvoir être interrogé pour savoir combien de jetons il reste ;
      • on doit pouvoir tirer des jetons, mais aussi pouvoir les remettre.

      Mais l'algo de FY reste un classique à connaître.

      • Partager sur Facebook
      • Partager sur Twitter
        26 novembre 2020 à 16:20:38

        Tout d'abord merci pour votre réponse mais je n'arrive pas à l'appliquer à mon problème.

        Je vous mets le code que j'ai fait, mais j'ai 2 problèmes mes chevalets sont à l'affichage identiques (d'où ma question pour obtenir une chaîne aléatoire à partir d'une autre, car je pense que c'est de cette partie de mon code d'où vient le problème) et je ne sais pas comment faire pour qu'une fois une lettre tirée elle ne puisse plus être utilisable.

        (Pour information mon chevalet fait partie d'une structure t_joueur et peut contenir 7 lettres.)

        void pioche(t_joueur tabjoueur[4], int nbjoueur)
        {
        
             int i,j,k;
        
            char pioche[103]="AAAAAAAAABBCCDDDEEEEEEEEEEEEEEEFFGGHHIIIIIIIIJKLLLLLMMMNNNNNNOOOOOOPPQRRRRRRSSSSSSTTTTTTUUUUUUVVWXYZ??";
            srand(time(NULL));
        
        
               for(j=0;j<nbjoueur;j++)//construction de chevalet en fonction du nombre de joueurs
               {
        
        
                   for(i=0;i<7;i++)//construction du chevalet
                    {
        
                        tabjoueur[j].chevalet[i]=pioche[rand()%102];//prise d'une lettre aleatoirement dans la pioche
                        tabjoueur[j].chevalet[7]=' ';
        
                    }
        
                    printf("chevalet joueur %d : %s",j+1, tabjoueur[j].chevalet);
        
        
                    printf("\n");
               }
        
        }

        Je ne sais pas si c'est comme ça ? J'ai mis langage C++ je ne trouve pas C

        -
        Edité par bosozoku 26 novembre 2020 à 16:47:58

        • Partager sur Facebook
        • Partager sur Twitter
          26 novembre 2020 à 16:41:15

          Pour insérer du code utilise le bouton d'insertion de code … sinon ce n'est pas super lisible. Tu peux modifier ton message précédent.

          Edit: tu n'as pas essayé d'utiliser l'algo que je t'ai donné ?

          -
          Edité par White Crow 26 novembre 2020 à 16:43:02

          • Partager sur Facebook
          • Partager sur Twitter
            26 novembre 2020 à 17:09:10

            J'ai essayé mais j'arrive pas bien à passer d'algorithme à langage C; est-ce que l'équivalent de votre algorithme serait ce code ? 
            char a[n]
            char echange[n] ;
            int  j ;
            for(i=n-1 ;i=1 ;i++)
            {	
            	j=rand()%(i-0+1)+0 ;
            	a[j]=echange[n] ;
            	a[j]=a[i] ;
            	a[i]=echange[n] ;
            }
            

            :
            • Partager sur Facebook
            • Partager sur Twitter
              26 novembre 2020 à 17:09:37

              Le problème comme tu fais, c'est que tu pioches un pion dans le sac, mais tu ne le retire pas du sac ! (C'est pourtant nécessaire si tu veux suivre la règle du jeu).

              En mélangeant les pions, c'est plus facile pour les retirer, puisque tu les retires en commençant par la fin et tu peux donc décrémenter l'indice du tableau au fur et à mesure que tu les retire. 

              Edit : Tu n'as pas besoin d'un deuxième tableau pour faire un échange de caractère, ce sont des char que tu échanges !

              Enlève moi c'est -0 et +0 qui ne servent à rien dans ton calcul de nombre aléatoire, ça rend ton code illisible pour rien !

              PS : Ils vous ont donné un projet balaise pour votre niveau non ? (J'ai lu l'énoncé). 

              -
              Edité par rouloude 26 novembre 2020 à 17:20:52

              • Partager sur Facebook
              • Partager sur Twitter
                26 novembre 2020 à 17:39:12

                Si je comprends bien le code ce serait plutôt ça ?
                char a[n];
                int  j ;
                for(i=n-1 ;i=1 ;i--)
                {  
                    j=rand()%(i+1);
                    a[j]=a[i] ;
                }

                Au lieu d'incrémenter je décrémente ?

                PS : oui c'est vrai que c'est dur, mais le problème c'est surtout le temps, on a peu de temps pour le faire

                • Partager sur Facebook
                • Partager sur Twitter
                  26 novembre 2020 à 17:50:44

                  As tu bien regardé le test de ton for :  i=1 , tu penses que c'est un test ça !

                  En ce qui concerne l'échange : tu mets a[i] dans a[j] mais ce qu'il y avait dans a[j], c'est passé où ?  : A la trappe !

                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 novembre 2020 à 18:01:53

                    Je suis désolé le problème c'est que je comprends pas ce que fais le code comme j'ai dit au dessus je sais pas passer d'algorithme à langage C.

                    Donc j'essaye de l'écrire en langage C mais j'arrive quand même pas à déchiffrer ce qu'il fait, même je sais qu'il doit mélanger aléatoirement une chaîne. 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 novembre 2020 à 18:14:56

                      Pour échanger:
                      int tmp = tableau[i];
                      tableau[i] = tableau[j];
                      tableau[j] = tmp;
                      Pour les point associés à une lettre, on peut se faire un tableau de 26 cases donnant le point pour chaque lettre.
                      Pour y accéder, en supposant que lettre soit la lettre en question:
                      int point = tableauPoints[lettre - 'A'];
                      Je suppose qu'on est toujours en majuscules.
                      • Partager sur Facebook
                      • Partager sur Twitter

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

                        26 novembre 2020 à 18:21:07

                        Rassure moi, tu sais utilisé les boucle for parce que pour un test d'égalité ce n'est pas = mais == !!!!!!

                        pour échanger deux cases du tableau par exemple a[i] et a[j] : tu sauvegardes a[i] dans une variable temporaire, puis a[j] dans a[i] , puis la variable temporaire dans a[j] , c'est quand même pas bien compliqué ! Si tu peine à suivre fait toi un dessin !

                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 novembre 2020 à 19:06:34

                          J'ai essayé de voir ce que faisait ce code appliqué à ma chaine pioche et rien ne se passe, la taille de la pioche ne change pas de plus elle n'est pas du tout mélangé à l'affichage. Je suis vraiment perdu.

                          int main()
                          {
                              int i,j;
                              int taille;
                              char tmp;
                              char pioche[103]="AAAAAAAAABBCCDDDEEEEEEEEEEEEEEEFFGGHHIIIIIIIIJKLLLLLMMMNNNNNNOOOOOOPPQRRRRRRSSSSSSTTTTTTUUUUUUVVWXYZ??";
                          
                              srand(time(NULL));
                              taille=strlen(pioche);
                              printf("taille pioche=%d\n", taille);
                          
                              for(i==102;i==1;i--)
                              {
                                  j=rand()%(103);
                                  tmp=pioche[i];
                                  pioche[i]=pioche[j];
                                  pioche[j]=tmp;
                              }
                          
                              printf("pioche=%s\n", pioche);
                              taille=strlen(pioche);
                              printf("taille pioche=%d\n", taille);
                          
                          
                              return 0;
                          }



                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 novembre 2020 à 19:20:51

                            for(i==102; ... c'est mal parti ...
                            Tu fais une assignation dans la première partie du for, pas un test.
                            Pourquoi calculer la longueur de la chaîne si tu ne l'utilises pas dans ta boucle et le rand() ?
                            • Partager sur Facebook
                            • Partager sur Twitter

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

                              26 novembre 2020 à 19:29:27

                              Tu ne sais pas utiliser le for

                                  for(i==102;  i==1;  i--)

                              affectation de la variable avec == une affectation c'est = quand même !!

                              avec ton test i==1 tu ne rentres jamais dans la boucle ! 

                              -
                              Edité par rouloude 26 novembre 2020 à 19:30:50

                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 novembre 2020 à 19:30:50

                                Ligne 12, tu n'entres méme pas dans le for. Le for, c'est : j'initialise (ce qui est écrit avant le 1er ; ), je teste la condition (ce qui se trouve entre les deux ; ) et si la condition est remplie, j'exécute ce qui se trouve dans le corps du for. Enfin, j'exécute la troisième partie (ce qui se trouve après le 2ème ; ).

                                • 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

                                  26 novembre 2020 à 19:38:12

                                  J'ai corrigé j'ai mis for(i=102;i=1;i--) mais du coup rien ne s'affiche, et j'ai calculé la longueur de la chaîne avant/après pour voir si elle changeait de taille mais ça n'a aucune utilité c'était juste pour moi voir si elle changeait de taille parce que je comprends toujours pas ce que ce programme est sensé faire.

                                  Je suis désolé je me répète mais mon but étant de mélanger la pioche et d'en tirer 7 lettres aléatoirement et que ces 7 lettres ne puissent pas être reprises si je recommence un tirage.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    26 novembre 2020 à 19:40:31

                                    i=1 n'est pas un test, mais une assignation. Tu as loupé toutes les bases du C. Recommence à le cours à zéro.

                                    -
                                    Edité par edgarjacobs 26 novembre 2020 à 19:41:51

                                    • 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

                                      26 novembre 2020 à 20:31:25

                                      bosozoku a écrit:

                                      Je suis désolé je me répète mais mon but étant de mélanger la pioche et d'en tirer 7 lettres aléatoirement et que ces 7 lettres ne puissent pas être reprises si je recommence un tirage.

                                      Tu n'as pas besoin de te répéter, on sait très bien ce que tu dois faire, mais pour mélanger ton tableau, il te faut une boucle for (éventuellement while), mais tu ne sais pas faire une boucle for, ça fait pourtant partie des bases minimum à savoir avant de s'attaquer à un projet !

                                      for (initialisation ; test ; itération) opération;
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        27 novembre 2020 à 1:35:20

                                        • Partager sur Facebook
                                        • Partager sur Twitter

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

                                          27 novembre 2020 à 12:30:20

                                          Merci pour votre aide, mais en effet apparemment je ne comprends pas bien le for, mon problème c'est le test dans mon for, je ne sais pas quoi mettre j'ai essayé ==1, >1,<1,>=1,<=1, et >0 

                                          Je vois à l'affichage que ma chaine est mélangé que si je mets >0, mais la taille diminue aléatoirement c'est-à-dire que des fois elle fait 60 caractères des fois 20 etc...

                                          Même si je relis mon cours et le liens que vous m'avez donné sur les boucles je ne comprends pas mon erreur

                                          int main()
                                          {
                                              int i,j;
                                              int taille;
                                              char tmp;
                                              char pioche[103]="AAAAAAAAABBCCDDDEEEEEEEEEEEEEEEFFGGHHIIIIIIIIJKLLLLLMMMNNNNNNOOOOOOPPQRRRRRRSSSSSSTTTTTTUUUUUUVVWXYZ??";
                                          
                                              srand(time(NULL));
                                              taille=strlen(pioche);
                                              printf("taille pioche=%d\n", taille);
                                          
                                              for(i=102;i>0;i--)
                                              {
                                                  j=rand()%(102+1);
                                                  tmp=pioche[i];
                                                  pioche[i]=pioche[j];
                                                  pioche[j]=tmp;
                                              }
                                          
                                              printf("pioche=%s\n", pioche);
                                              taille=strlen(pioche);
                                              printf("taille pioche=%d\n", taille);
                                          
                                          
                                              return 0;
                                          }
                                          

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            27 novembre 2020 à 14:19:58

                                            Il y a du mieux !

                                            Sauf qu'il ne faut pas mélanger le '\0' de fin de chaîne, sinon ça raccourcis la chaîne de caractère !

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              27 novembre 2020 à 14:33:09

                                              Ah je comprends ! Mais comment je fais ça ? J'utilise une condition if ?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                27 novembre 2020 à 15:13:04

                                                Le '\0' caractère de fin de chaîne, il se trouve en fin de ton tableau de caractère, à la position 102 du tableau (tes lettres sont aux posions 0 à 101).

                                                Les indices de tableau allant de 0 à n-1.

                                                Alors quand tu mélanges les caractères du tableau, il faut que le caractère '\0' reste en fin de chaîne, c'est à dire qu'il reste à la position 102 !

                                                Edit : non pas de if !!! C'est juste que tu parcourt ton tableau un poil trop loin !

                                                -
                                                Edité par rouloude 27 novembre 2020 à 15:15:19

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  27 novembre 2020 à 15:47:23

                                                  J'ai suggéré de faire:
                                                  for(i=taille-1; i>=0; i--)
                                                  et
                                                  j=rand()%taille;
                                                  ce n'est pas pour rien ...T
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

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

                                                    27 novembre 2020 à 17:20:22

                                                    Merci à vous !  Ma chaîne est désormais dans un sens aléatoire !
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      27 novembre 2020 à 17:32:33

                                                      Bien ! Bon courage pour la suite !

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      chaine aléatoire à partir d'une autre

                                                      × 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