IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

générer un caractère aléatoirement


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Points : 47
    Points
    47
    Par défaut générer un caractère aléatoirement
    bonsoir à tous,

    Voilà je souhaiterais stocker dans un tableau un caractere qui aurait ete generé aleatoirement (oui mais comment, je sais pas).

    Je connais déjà la fonction rand() qui elle genere des nombres aleatoirement.
    Je sais aussi qu un caractere à la base n est qu un nombre.

    J ai déjà essyé cecile a minuscule etant le 97 et z le 122)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       long chiffre;
       const long MAX = 122, MIN = 97;
       char tableau[1];
     
       srand(time(NULL));
       chiffre = (rand() % (MAX - MIN + 1)) + MIN;
       tableau[1] = chiffre;
      printf("%c",tableau);
    mais les resultat ne se trouve pas seulement dans les lettres minuscules comme je l aurai souhaité. Je fais certainement fausse route.

    Quelqu un pourrait-il me donner un coup de pouce ?

    Merci par avance

    Shaz
    Hier un manchot a frappé a ma fenêtre, il a frappé si fort qui il l'a cassée; et alors la je me suis senti libre.....

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
     
    int main (void)
    {
       unsigned loop = 1000;
     
       srand ((unsigned) time (NULL));   
     
       while (loop--)
       {
          putchar (rand () % 26 + 'a');
       }
     
       return 0;
    }
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    le a minuscule etant le 97 et z le 122
    C'est vrai sur un système qui utilise un codage basé sur ASCII (Windows par exemple).

    Correction (première approximation) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    long chiffre;
    const long MAX = 122, MIN = 97;
    char tableau[1];
    
    srand(time(NULL));
    chiffre = (rand() % (MAX - MIN + 1)) + MIN;
    tableau[0] = chiffre;
    printf("%c",tableau[0]);
    tableau est un tab. de 1 caractère, son seul élément est tableau[0] (l'indice du premier élément d'un tableau est 0, pas 1).

    Ensuite :
    - Pourquoi des longs partout ? int suffit.
    - Pourquoi utiliser un tableau si ce n'est que pour stocker un caractère ? Qu'est-ce qui est mal avec char mon_car ?
    - putchar(mon_char) peut rempacer printf("%c", mon_char);
    - Il existe une bien meilleure méthode pour obtenir un nombre aléatoire compris entre un min et un max, expliquée ici.

  4. #4
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Points : 47
    Points
    47
    Par défaut Reponse à melem et nicolas.sitbon
    Bonjour et un grand merci à tous les deux,

    Ta fonction nicolas.sitbon est terrible, et du coup j ai remplacer le putchar par le nom de ma variable comme tu m a dit Melem, plutot qu un tableau.

    Peut tu me dire nicolas.sitbon où tu as trouvé cet facon de generer un nombre aleatoire.(tu l a peut etre creeé toi meme).

    En tous les cas merci ca me fait bien avancer dans mon petit projet.

    Cordialement

    Shaz
    Hier un manchot a frappé a ma fenêtre, il a frappé si fort qui il l'a cassée; et alors la je me suis senti libre.....

  5. #5
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par shazad Voir le message
    Peut tu me dire nicolas.sitbon où tu as trouvé cet facon de generer un nombre aleatoire.(tu l a peut etre creeé toi meme).
    La fonction rand() me renvoie un nombre dans l'intervalle [0, {RAND_MAX}], j'ai diminué cet interval avec l'opérateur % pour avoir l'interval [0, 25] (les 26 lettres de l'alphabet) que j'ajoute à la valeur du caractère 'a'.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par shazad Voir le message
    bonsoir à tous,

    Voilà je souhaiterais stocker dans un tableau un caractere qui aurait ete generé aleatoirement (oui mais comment, je sais pas).

    Je connais déjà la fonction rand() qui elle genere des nombres aleatoirement.
    Je sais aussi qu un caractere à la base n est qu un nombre.
    Il faut décoreller le traitement numérique (nombre de 0 à n-1) de la valeur du caractère. Pour cela on utilise un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char const charset[] = "abcDEF123";
    int i_rnd = rand() % (sizeof charset - 1);
    int c = charset[i_rnd];
    putchar (c);
    Dans charset, tu mets ce que tu veux...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    La fonction rand() me renvoie un nombre dans l'intervalle [0, {RAND_MAX}], j'ai diminué cet interval avec l'opérateur % pour avoir l'interval [0, 25] (les 26 lettres de l'alphabet) que j'ajoute à la valeur du caractère 'a'.
    C'est pas portable. La norme ne garantie pas que les valeurs soient consécutives... (à part pour '0' à '9').
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    C'est pas portable. La norme ne garantie pas que les valeurs soient consécutives... (à part pour '0' à '9').
    Cela a déjà été précisé par melem, vu le peu d'implémentation qui utilise encore l'EBCDIC, je propose quand même la solution.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Cela a déjà été précisé par melem, vu le peu d'implémentation qui utilise encore l'EBCDIC, je propose quand même la solution.
    Et pour les accentuées ?
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Points : 47
    Points
    47
    Par défaut salut
    Rebonjour,

    En fait chez moi, ca marche bien avec unsigned loop = 1, sinon avec 1000 il me fait n importe quoi.

    Ah, ce que j aimerai comprendre tous ce que vous dites.

    Cordialement

    Shaz
    Hier un manchot a frappé a ma fenêtre, il a frappé si fort qui il l'a cassée; et alors la je me suis senti libre.....

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par shazad Voir le message
    En fait chez moi, ca marche bien avec unsigned loop = 1, sinon avec 1000 il me fait n importe quoi.
    C'est à dire ?

    Essai du code de Nicolas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    pwzfetcoffldfqzraubxtsngbfsjsracxozonaymjskfgmplgqafnaffqsqvactaxlnmqykimkhalwyt
    earsfbeogniqscrvkfofjbotmsjegipjbggovnyoozaujkyzafmegzaheoqflmsfusoydirrylmdveqn
    idajvgzhnzntyuibhittpnrwvtlafufkpzmgeiibrbpaylxsnctjjwycgnorpkptcfcxhkucpfvfqqpj
    twgrlqqtpfdaeycjlmhzhwrembnywsrxpozvtrfwrbijrmubgyxinexeqonmpcxasjypamvhnepyyyuk
    wdvykqchysdoawrxbbzunllvpyqgwilbgedeqsyoauhpbqzlybfrgsguzvhrdvbpsdxmjgogfydsrdah
    cfleghdbodaccrmoztahqioncclksnzktezgepojtgtimsnxadcuqcwszqnixeqwkilpkefbjmkrxsof
    ngfpcwiuxmvrlejsyaqlzbrixbnvwnxhfjepmlzmvycwivcmveklpvxgvhlkyvvmlmpmgrxxbwnpfwir
    kjtgbssujipwzkeahmcrqaigandrlcpztniraomcalpsahizehmqiovijhsxgzpxzfjdyfnzrirumssu
    cjomijvmcukekozglfsggdvjexorttgpygsuseuphqclodqsxbscbuwluuchrolnragdaoynbjystmwc
    elvetwegavfkzdfxdlsouzqftxyqalhojvwixujcmynzeoeythgapoqousjrusstwyvtvwtulxdpjltj
    rwosirczgieqrdjnobsuwciauhgitemxseuswkrfpentvrwzooaahsnddiwkshwsrgtxlbjjpqufzahu
    aszgusbxcpzmwltntyaeriaqblrbgttbklpgkozjistoistqaoawdldpbaupihfzhpfltepmccjhrcxy
    conqekcntpygukrlmkctirbjlqoejptndwtfzsou
    Process returned 0 (0x0)   execution time : 0.079 s
    Press any key to continue.
    Ce code fait exactement ce qu'il doit faire. Qu'est-ce que tu n'as pas compris ?
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Et pour les accentuées ?
    A ma connaissance il n'y a pas d'accent en ASCII. Soyons clair le bonne méthode est bien la tienne. J'ai simplement proposé une alternative rapide non portable sur autre que ASCII.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  13. #13
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par shazad Voir le message
    Rebonjour,

    En fait chez moi, ca marche bien avec unsigned loop = 1, sinon avec 1000 il me fait n importe quoi.

    Ah, ce que j aimerai comprendre tous ce que vous dites.

    Cordialement

    Shaz
    J'ai mis 1000 arbitrairement pour être à peu près sûr que toutes les lettres de l'alphabet sortirait et que la méthode proposée fonctionnait (avec les restrictions mentionnées par melem et Emmanuel).
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  14. #14
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Points : 47
    Points
    47
    Par défaut Oups pardon
    Effectivement j ai fait un test precipité du code de nicolas.sitbon. J ai etait effrayer par tous les caracteres renvoyés. j ai ressayer avec unsigned loop = 1000 et au lieu de putchar ma variable; et ma variable contient bien un seul caractere.(tout comme je voulais).

    J utilise Kdevelop sous linux.

    Ce que je comprend pas:

    Pourquoi le code de nicoals.sitbon n est pas portable par rapport a celui d Emmanuel.

    Quel difference entre le codage des caracteres sous linux par rapport à windows.

    Shaz
    Hier un manchot a frappé a ma fenêtre, il a frappé si fort qui il l'a cassée; et alors la je me suis senti libre.....

  15. #15
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Sous Windows et Linux et d'une manière générale tant que ton jeu de caractère utilise un codage qui est un superset de l'ASCII pas de problème car le code de la lettre 'b' est bien celui de 'a' + 1 et ainsi de suite. Mais si ton codage est par exemple EBCDIC comme sur les mainframes IBM, les codes ne se suivent pas.
    Prend la méthode d'Emmanuel Delahaye qui a le mérite d'être portable et qui plus est élégante.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  16. #16
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Points : 47
    Points
    47
    Par défaut
    J ai fait ceci avec le code d Emmanuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char caractereUn ;
    char caractereDeux;
    char caractereTrois;
     
    char const charset[] = "abcDEF123";
    int i_rnd = rand() % (sizeof charset - 1);
    caractereUn = charset[i_rnd];
    caractereDeux = charset[i_rnd];
    caractereTrois = charset[i_rnd];
     
    putchar(caractereUn);
    putchar(caractereDeux);
    putchar(caractereTrois);
    Et ca me renvois toujours 3 fois la lettre 'b'.

    Alors qu avec ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    char caractereUn ;
    char caractereDeux;
    char caractereTrois;
     
    unsigned loop = 1000;
     
    srand ((unsigned) time (NULL));   
     
    while (loop--)
    {
          caractereUn = (rand () % 26 + 'a');
          caractereDeux = (rand () % 26 + 'a');
          caractereTrois = (rand () % 26 + 'a');
    }
     
    putchar(caractereUn);
    putchar(caractereDeux);
    putchar(caractereTrois);
    J ai toujours des caracteres differents.(Ce que je souhaitez).

    Shaz
    Hier un manchot a frappé a ma fenêtre, il a frappé si fort qui il l'a cassée; et alors la je me suis senti libre.....

  17. #17
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
    #include <stdlib.h>
     
    static char get_random_char (void)
    {
       static char const charset[] = "abcdefghijklmnopqrstuvwxyz";
       return charset[rand() % (sizeof charset - 1)];
    }
     
    int main (void)
    {
       srand ((unsigned) time (NULL));
     
       putchar (get_random_char ());
       putchar (get_random_char ());
       putchar (get_random_char ());
     
       return 0;
    }
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  18. #18
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Points : 47
    Points
    47
    Par défaut
    Infiniment meci nicolas.sitbon.

    Shaz
    Hier un manchot a frappé a ma fenêtre, il a frappé si fort qui il l'a cassée; et alors la je me suis senti libre.....

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par shazad Voir le message
    J ai fait ceci avec le code d Emmanuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char caractereUn ;
    char caractereDeux;
    char caractereTrois;
     
    char const charset[] = "abcDEF123";
    int i_rnd = rand() % (sizeof charset - 1);
    caractereUn = charset[i_rnd];
    caractereDeux = charset[i_rnd];
    caractereTrois = charset[i_rnd];
     
    putchar(caractereUn);
    putchar(caractereDeux);
    putchar(caractereTrois);
    Et ca me renvois toujours 3 fois la lettre 'b'.
    C'est normal. Est-ce que tu comprends ce que tu fais ? Qu'est-ce qui aurait fait changé la valeur de i_rnd entre 2 lectures de charset, selon toi ?

    Il faut un peut réfléchir avant de coder...
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Points : 47
    Points
    47
    Par défaut
    C est vrai que j ai bien du mal à comprendre tous cela, mais je pense que mon erreur viens du fait que je me sers d un seul rand() pour remplir mes 3 variables.

    Nicolas.sitbon lui a fait un appel de fonction à chaque fois, je pense que l on reinitialise à chaque passage dans la fonction.

    Honnetement j ai bien du mal meme si j ai fait des essais pour comprendre.

    Shaz
    Hier un manchot a frappé a ma fenêtre, il a frappé si fort qui il l'a cassée; et alors la je me suis senti libre.....

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. générer deux caractères aléatoires
    Par sarah65536 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/06/2009, 12h21
  2. Réponses: 16
    Dernier message: 08/03/2006, 11h18
  3. Besoin de générer une chaine aléatoire
    Par warsky dans le forum Langage
    Réponses: 7
    Dernier message: 01/12/2005, 19h34
  4. générer un nombre aléatoire gaussien
    Par kayari dans le forum Probabilités
    Réponses: 9
    Dernier message: 24/05/2005, 23h57
  5. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo