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 :

Nombre aléatoire dans une chaine


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Nombre aléatoire dans une chaine
    Bonjour,

    j'aurais besoin d'aide pour coder une fonction qui fasse ceci.

    Cette fonction doit donner 3 nombres aléatoires compris entre 0 et 100 puis mettre les nombres sortis dans une chaine de caractères séparés par des virgules.
    La fonction renverra la chaine crée.

    Par exemple :
    si on obtient comme chiffre : 3 7 78
    La chaine crée devra être chaine = "3,7,78"

    Merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 128
    Points : 101
    Points
    101
    Par défaut
    Salut,
    Ta fonction n'est pas difficile en soit....
    Il faut que tu génère tes 3 nombres aléatoires en utilisant la fct rand (tu trouvearas facilement des informations sur le forum ou sur le site)...
    Ensuite utilise la fonction itoa pour convertir ton entier en chaine de caractère. Voici le prototype de cette fonction :
    char *itoa(int value, char *string, int radix);
    Apres, il suffit de concaténer tes trois chaines avec strcat...
    Le strcat sera fait de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    strcat(chaineFinale,chaineValeur1) ;
    strcat(chaineFinale,",") ;
    strcat(chaineFinale,chaineValeur2) ;
     strcat(chaineFinale,",") ;
    strcat(chaineFinale,chaineValeur3) ;
    Si tu veux plus d'aide , n'hésite pas...

  3. #3
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par georges_jung
    Apres, il suffit de concaténer tes trois chaines avec strcat...
    Cela me semble bien compliqué...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char buf[512];
     
    sprintf(buf,"%d,%d,%d",nbr1,nbr2,nbr3);
    Bien sûr il faut que la mémoire allouée pour buf soit suffisante,
    Jc

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 128
    Points : 101
    Points
    101
    Par défaut
    autant pour moi... C'est clair que c'est plus efficace...
    Mais perso, apres avoir eu de nombreux problemes lors d'un projet de programmation sur Microprocesseur ARM avec la fct sprintf j'ai préféré l'oublier ... Mais bon, elle est qd meme bien pratique...

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    #include <stdio.h>
    #include <stdlib.h>

    Bonjour,

    en regroupant tout ce qui a été donné, j'ai écrit ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main(void){
      int val1, val2, val3;
      char buff[BUFSIZ];
     
      val1 = rand()%100;
      val2 = rand()%100;
      val3 = rand()%100;
      sprintf(buff, "%d,%d,%d",val1,val2,val3);
      printf("%s\n", buff);
     
      return 0;
    }
    J'ai lancé le programme 10 fois et j'obtiens toujours ce résultat
    C'est n'est donc pas un tirage aléatoire.
    Il y a t-il un souci dans ce que j'ai écrit ?
    De plus comment faire pour que le chiffre 100 puisse être donné car en faisant %100, 100 ne peut jamais être obtenu

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Il faut initialiser le generateur. La FAQ t'aurait aide sur ce point, mais comme il y a quelques petits problemes dans les explications de la FAQ sur d'autres points, tu peux aussi regarder
    http://www.bourguet.org/cpp/random.pdf

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Il faut initialiser le generateur. La FAQ t'aurait aide sur ce point, mais comme il y a quelques petits problemes dans les explications de la FAQ sur d'autres points, tu peux aussi regarder
    http://www.bourguet.org/cpp/random.pdf
    Merci pour le lien.
    J'obtiens maitenant des séries aléatoires.
    Est-ce que tu saurais comment faire pour que 100 soit une valeur possible ? car avec le %100, il ne pourrait jamais être donné

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Premium
    Merci pour le lien.
    J'obtiens maitenant des séries aléatoires.
    Est-ce que tu saurais comment faire pour que 100 soit une valeur possible ? car avec le %100, il ne pourrait jamais être donné
    %101 ?

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Premium
    Merci pour le lien.
    J'obtiens maitenant des séries aléatoires.
    Est-ce que tu saurais comment faire pour que 100 soit une valeur possible ? car avec le %100, il ne pourrait jamais être donné
    Oui. Ca se trouve dans le texte.

  10. #10
    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 Premium
    j'aurais besoin d'aide pour coder une fonction qui fasse ceci.
    Au moins, pour une fois, on a une spec claire. Par contre, tu as oublié de poster le code avec lequel tu as un problème.

  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 georges_jung
    Ensuite utilise la fonction itoa
    Pas standard.

  12. #12
    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 sprintf() en embarqué...
    Citation Envoyé par georges_jung
    apres avoir eu de nombreux problemes lors d'un projet de programmation sur Microprocesseur ARM avec la fct sprintf j'ai préféré l'oublier ...
    Les seuls problèmes que j'ai eu avec sprintf() en embarqué, c'est quand j'ai voulu l'utiliser à un moment du code où la pile était très petite (phase de démarrage d'un MPC68302, pendant le test mémoire externe). Depuis, j'ai développé ceci pour ces cas difficiles :

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module ITOA

    Mais sinon, tant que l'on ne déborde pas du tableau de char (0 inclus!), il n'y a aucun problème avec cette fonction.
    .
    Quels sont les problèmes que tu as rencontré ?

  13. #13
    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 Premium
    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
     
    #include <stdio.h>
    #include <stdlib.h> 
     
    int main(void){
      int val1, val2, val3;
      char buff[BUFSIZ];
     
      val1 = rand()%100;
      val2 = rand()%100;
      val3 = rand()%100;
      sprintf(buff, "%d,%d,%d",val1,val2,val3);
      printf("%s\n", buff);
     
      return 0;
    }
    • %100 varie de 0 à 99... Pour 0..100, c'est autre chose...
    • Rien ne prouve que BUFSIZ ait la taille suffisante.
    Par contre, sizeof "100,100,100" devrait convenir. Je suggère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      char buff[sizeof "100,100,100"];
    J'ai lancé le programme 10 fois et j'obtiens toujours ce résultat
    C'est n'est donc pas un tirage aléatoire.
    Il y a t-il un souci dans ce que j'ai écrit ?
    De plus comment faire pour que le chiffre 100 puisse être donné car en faisant %100, 100 ne peut jamais être obtenu
    Il n'y a pas de tirage 'aléatoire' en C standard. C'est une séquence pseudo-aléatoire (à l'évidence) déterministe (mais qui dépend de l'implémentation).
    Par contre, comme indiqué dans doc, la fonction srand() permet de choisir une autre origine que 0 (par défaut). Pour ça, un moyen simple et portable est d'utiliser la valeur retournée par time() (change toutes les secondes).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <stdlib.h>
    #include <time.h>
     
       srand((unsigned) time (NULL));
    Cette fonction ne doit évidement être appelée qu'une seule fois au début du programme (1 ère instruction de main(), par exemple).

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 128
    Points : 101
    Points
    101
    Par défaut
    Les problemes que j'ai rencontré avec sprintf ont été tres bizarre et je n'était pas le seul de mon groupe (je suis en ecole d'ingé)... Par moment, les différents sprintf que j'insérai dans mon code fonctionnait parfaitement puis, sans rien rajouté de particulier (en tout cas rien en rapport avec le sprintf) il ne passait plus et renvoyait des choses trs incohérentes...
    Aucun de mes profs n'a été en mesure de nous expliquer pourquoi, et ils nous ont demandé de ne pas utiliser cette fonction et de trouver un subterfuge pour éviter ces problemes... bref la galère...
    enfin voila...

  15. #15
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par georges_jung
    Les problemes que j'ai rencontré avec sprintf ont été tres bizarre et je n'était pas le seul de mon groupe (je suis en ecole d'ingé)... Par moment, les différents sprintf que j'insérai dans mon code fonctionnait parfaitement puis, sans rien rajouté de particulier (en tout cas rien en rapport avec le sprintf) il ne passait plus et renvoyait des choses trs incohérentes...
    Aucun de mes profs n'a été en mesure de nous expliquer pourquoi, et ils nous ont demandé de ne pas utiliser cette fonction et de trouver un subterfuge pour éviter ces problemes... bref la galère...
    enfin voila...
    Problème typique de débordement de mémoire. Cela n'a pas forcément un rapport avec sprintf qui, comme l'a signalé Emmanuel, dans le cas de non débordement, fonctionne parfaitement bien.

    Jc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.2] Nombre générer un nombre aléatoire dans une boucle
    Par link.80 dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2011, 08h26
  2. [PHP 5.1] verifier si un nombre existe dans une chaine de caractere
    Par moukit233 dans le forum Langage
    Réponses: 2
    Dernier message: 10/11/2009, 17h05
  3. [PHP 5.2] Additionner des nombres entiers dans une chaine de caractères
    Par lecaptain dans le forum Langage
    Réponses: 2
    Dernier message: 23/10/2009, 12h12
  4. le nombre d’occurrences dans une chaine de caractére
    Par adilo dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 28/06/2006, 12h24
  5. [FLASH MX] Choisir un nombre aléatoire dans une liste
    Par grenatdu55 dans le forum Flash
    Réponses: 4
    Dernier message: 23/04/2005, 21h09

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