Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment générer aléatoirement une lettre ?

Sujet résolu
    1 septembre 2007 à 21:56:54

    Bonjours je voudrais savoir comment je pourai faire pour généré une lettre (ou un chiffre mais à si je dois avoir q'une seule chose je préfereré que ce soit des lettre) de façon aléatoire (en utilisant une fonction qui à la base génére un nombre aléatoire).

    J'ai réadapter la fonction de Once prise dans ce tuto.

    1. char myRand(int min, int max) // en mettant je pence 0 et 128
    2. {  
    3. return (char) (min + ((float) rand() / RAND_MAX * (max - min + 1.0)));
    4. }


    Je peux donc optenir un char d'une valeur alétoire mais je ne c'est pas comment le transformer en lettre...

    Voila Merci
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      1 septembre 2007 à 22:06:48

      Génère un nombre entre 65 et 90 compris, ensuite fais ce que tu veux avec (65 est le code ASCII pour A).
      • Partager sur Facebook
      • Partager sur Twitter
        1 septembre 2007 à 22:09:23

        1. char randLetter() {
        2.     char min = 'a', max = 'z';
        3.     return (char) (min + ((float) rand() / RAND_MAX * (max - min + 1.0)));
        4. }

        Ça devrait marcher ;)
        • Partager sur Facebook
        • Partager sur Twitter
          1 septembre 2007 à 22:22:35

          Ok merci beaucoup une derniére précision esque je peux pas carrément faire

          1. char randLetter()
          2. {
          3. char min = ' ', max = '~'; //vu que ' ' et '~' sont les premiers et dernier caractéres ?
          4. return (char) (min + ((float) rand() / RAND_MAX * (max - min + 1.0)));
          5. }


          Edit : ça ne marche pas je reçois la valeur du char.
          • Partager sur Facebook
          • Partager sur Twitter
            2 septembre 2007 à 8:28:34

            Mais un char est une valeur... Avec un printf("%c",randLetter()) tu aurais ton char d'affiché, dependant je ne connais pas bien le fonctionnement de cout.
            Essaye peut-être: cout << "char="+randLetter() << endl;
            • Partager sur Facebook
            • Partager sur Twitter
              2 septembre 2007 à 11:27:48

              Ca ne marchera pas je pense. J'utilise ça
              1. for(int i=0; i<octes; i++)
              2.     {
              3.       key[i] = Myrand();
              4.     }


              Et j'obtien la valeurs numérique.

              En faite il me faut l'inverse de la fonction c_str() qui renvoi un tableau de char à partir d'un string.
              • Partager sur Facebook
              • Partager sur Twitter
                2 septembre 2007 à 11:52:20

                Meuuuuh non, cout est intelligent: il detecte les char et affiche leur symbole ASCII ;)
                1. char myLetter = randLetter();
                2. cout << myLetter << endl;

                Et si tu veux afficher sa valeur numérique:
                1. char myLetter = randLetter();
                2. cout << (int)myLetter << endl;

                :D
                • Partager sur Facebook
                • Partager sur Twitter
                  2 septembre 2007 à 21:01:09

                  Ben le probléme c'est que je n'utilise pas cout mais je fais :
                  1. for(int i=0; i<octes; i++)
                  2.     {
                  3.       key[i] = Myrand();
                  4.     }
                  5.   cout << ". ";
                  6.   for(int i=0; i<octes; i++)
                  7.     {
                  8.       FILE << key[i];
                  9.     }


                  Et mon fichier contient uniquement la valeur des char et non le caractére.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 septembre 2007 à 21:16:44

                    Et bien ça devrait fonctionner... ça n'est pas le cas ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 septembre 2007 à 21:20:20

                      Voila le contenu pour la génération de 64 caractére.
                      1. 111691061071185063104588477916680122119921004589335545108467044421265280111906092817812459105821057011658651081193812281405095116653833753754124117112
                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 septembre 2007 à 21:41:31

                        Il apparait comme ça affiché par quel moyen ? (tu as ouvert ton fichier avec bloc-note ? )
                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 septembre 2007 à 21:54:35

                          Key est un ofstream.
                          Le principe est de généré un code dans un fichier.
                          C'est pour ça que je peus voir les valeurs et que je pence qu'il me faudrait l'inverse de la fonction string.c_str().

                          (je suis sous linux donc je peux ouvrir tout les fichier automatiquement avec le fichier d'édition de base)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            3 septembre 2007 à 1:32:07

                            voilà le problème!

                            voici mon exemple :
                            1. std::string s; // char * encapsulé dans une classe
                            2. for( int  i = 0; i < OCTETS; i++ )
                            3. {
                            4.    s += MyRand();
                            5. }
                            6. std::ofstream ofs( CHEMIN_FICHIER.c_str() );
                            7. if( ofs.is_open() )
                            8. {
                            9.    ofs << s;
                            10. }


                            Note : CHEMIN_FICHIER est une constante de type "const std::string" et OCTETS une autre constante de type "const int"

                            Un ofstream n'est pas un tableau... pour envoyer des char utilise l'opérateur "<<".

                            Néanmoins comme il s'agit d'une chaine de caractère vaut mieux utiliser la puissance de la STL et tout stocker dans la string et ensuite la passer au flux à l'aide de l'opérateur.

                            Si tu as des questions : n'hésites pas!
                            • Partager sur Facebook
                            • Partager sur Twitter
                              3 septembre 2007 à 8:42:29

                              Euh oui je n'ai pas tout compris surtout que maintenant ça marche key était un tableau d'int :-°

                              Merci beaucoup a tous (par contre je veux bien d'autre explication MatteX)
                              et voila la fonction
                              1. char Myrand()
                              2. {
                              3. char min = ' ', max = '~';
                              4. return (char) (min + ((float) rand() / RAND_MAX * (max - min + 1.0)));  
                              5. }


                              Edit : Euh je toujours la même chose. Je croi que le terme est changer la graine mais comment on fait ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 septembre 2007 à 5:47:48

                                pour changer la graine il faut appeler srand() une fois dans le programme (d'habitude au début)

                                1. #include <ctime>
                                2. #include <string>
                                3. int main()
                                4. {
                                5.     srand( time( 0 ) );
                                6.     std::string s;
                                7.     // ...
                                8. }


                                Pour ce qui est de mon code : la seule différence c'est que j'utilise une std::string (Chaine de caractères) défini dans "#include <string>" et que j'envoie directement dans le flux de sortie du std::ofstream (en passant, FILE est un nom utilisé dans la bibliothèque standard C. Alors c'est à proscrire)

                                P.S. je te conseille fortement d'utiliser string : pour plus d'info va voir les documentations sur le C++ sur gotAPI.com (regarde dans la section C/C++ de la page d'accueil le 1er et 3e liens sont très bien)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  4 septembre 2007 à 9:02:54

                                  Ben merci beaucoup à tous.

                                  Moi aussi j'utilise habituellement string mais la il me semble que l'utilisation d'un tableau de char était inévitable vu que octets est récupérer plus au dans le programe.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 septembre 2007 à 15:20:35

                                    string est entièrement dynamique. Tu peux modifier la chaine n'importe quand et pas besoin de la supprimer au complet et de la réalloué. Tu peux facilement ajouter ou modifier une partie spécifique d'une chaine... c'est la magie de la POO ;) La classe s'occupe d'allouer la mémoire et de la désallouées au besoin.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Comment générer aléatoirement une lettre ?

                                    × 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