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 :

Nombres aléatoires [Tutoriel]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 136
    Par défaut Nombres aléatoires
    Bonjour,
    Voici mon "problême" :

    Lorsque je lance mon programme pour la 1ere fois, ca marche : c'est à dire qu'il affiche un nombre aléatoire. Si je le relance une 2eme fois, il me redonne le meme nombre.

    Si je recompile et que je le réexécute, il me redonne un autre nombre aléatoire.

    J'ai utiliser la méthode de la FAQ.
    J'ai entendu dire que Dev-C++ ne fonctionné pas bien avec les nombres aléatoire.

    Si quelqu'un sait comment je peux faire, qu'il n'hésite pas .

    Merci


    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>
    #include <time.h>
     
     
     
    int main(void)
        {
         srand(time(0));
         int nb;
         int N;
         N=101;
     
         nb = (int)((float)rand() / RAND_MAX * (N - 1));
         printf("%d \n",nb);
     
         return 0; 
     
         }

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    A priori je dirai que tu veux choisir un nombre entre 1 et 100 non?

    Si c'est la cas la bonne formule est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb = ((int)((float) (rand() * 10000 / RAND_MAX))) ;
    A part ca ton probleme vient du fait que tu ne laisse pas passer assez de temps entre 2 executions du programme.

    Lance ton programme attend 5 minutes et relance ton programme tu verra le nombre est différent.
    Tu donne a srand() la valeur de "l'heure" a cet instant si tu reexecute ton programme 2 secondes après la valeur de time(NULL) n'a pas beaucoup changé c'est pour ca que tu obtient les meme nombres.

    Test : remplace N = 101 par N = 10001 tu verra que 2 executions proche ne donne pas le meme nombre.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: [Débutant] Nb aléatoire
    Citation Envoyé par bdaboah
    Lorsque je lance mon programme pour la 1ere fois, ca marche : c'est à dire qu'il affiche un nombre aléatoire. Si je le relance une 2eme fois, il me redonne le meme nombre.

    Si je recompile et que je le réexécute, il me redonne un autre nombre aléatoire.
    Effectivement, le premier tirage est nase...
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int main (void)
    {
       srand (time (NULL));
     
       {
          int nb;
          int const N = 101;
     
          /* un coup pour rien... */
          rand ();
     
          {
             int i;
             for (i = 0; i < 10; i++)
             {
                nb = (int) ((double) rand () / RAND_MAX * (N - 1));
                printf ("%4d", nb);
             }
             printf ("\n");
          }
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      91  57  63  94  25  90  87  78  32   9
      64  37   8  99  36  74  31  48  76  86

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Bon ben j'ai rien dis (quoique ce que j'ai dis c'est pas faux non plus)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 136
    Par défaut
    Merci à vous deux ; ca marche dans les 2 cas.

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Skyrunner
    A priori je dirai que tu veux choisir un nombre entre 1 et 100 non?

    Si c'est la cas la bonne formule est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb = ((int)((float) (rand() * 10000 / RAND_MAX))) ;
    Pardon ?

    Pourquoi utlises-tu 10000 pour un nombre compris entre 1 et 100 ?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    surtout que RAND_MAX n'est en aucun cas un multiple de 100 ou quoi que ce soit, c'est généralement une puissance de 2 moins 1... (comme 32767)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par gl
    Citation Envoyé par Skyrunner
    A priori je dirai que tu veux choisir un nombre entre 1 et 100 non?

    Si c'est la cas la bonne formule est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb = ((int)((float) (rand() * 10000 / RAND_MAX))) ;
    Pardon ?

    Pourquoi utlises-tu 10000 pour un nombre compris entre 1 et 100 ?
    Désolé j'ai fais un copier/coller du code mais je l'avais modifer. Bien sur c'est un 100 a la place du 10 000 (pour obtenir un nombre entre 0 et 100)

    Citation Envoyé par medinoc
    surtout que RAND_MAX n'est en aucun cas un multiple de 100 ou quoi que ce soit, c'est généralement une puissance de 2 moins 1... (comme 32767)
    J'ai beau relire ta phrase je comprends pas pourquoi tu a dis ca
    rand() sort un nombre compris entre 0 et RAND_MAX si je le mulitpli par 100 et que je le divise par RAND_MAX j'obtiens bien un nombre entre 0 et 100

  9. #9
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Skyrunner
    J'ai beau relire ta phrase je comprends pas pourquoi tu a dis ca
    rand() sort un nombre compris entre 0 et RAND_MAX si je le mulitpli par 100 et que je le divise par RAND_MAX j'obtiens bien un nombre entre 0 et 100
    Quelques explications : Les nombres aléatoires en C
    Citation Envoyé par Emmanuel Delahaye
    Effectivement, le premier tirage est nase...
    est ce que tu pourrais expliquer un peu, s'il te plait? c'est le générateur de Mingw qui n'est pas capable d'être opérationnel dès le premier appel (c'est un diesel?).

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gege2061
    Citation Envoyé par Emmanuel Delahaye
    Effectivement, le premier tirage est nase...
    est ce que tu pourrais expliquer un peu, s'il te plait? c'est le générateur de Mingw qui n'est pas capable d'être opérationnel dès le premier appel (c'est un diesel?).
    Même si on utilise srand(), la première valeur tirée est toujours la même... Je n'ai jamais eu ce problème avec Borland C.

  11. #11
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par gege2061
    Citation Envoyé par Emmanuel Delahaye
    Effectivement, le premier tirage est nase...
    est ce que tu pourrais expliquer un peu, s'il te plait? c'est le générateur de Mingw qui n'est pas capable d'être opérationnel dès le premier appel (c'est un diesel?).
    Même si on utilise srand(), la première valeur tirée est toujours la même... Je n'ai jamais eu ce problème avec Borland C.
    Ok,

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

Discussions similaires

  1. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  2. nombre aleatoire
    Par Bob dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 17/06/2002, 18h12
  3. [Comparatifs] Limites nombres tables et quantité de données
    Par benj63 dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 13/06/2002, 21h31
  4. Nombre de fichiers ouverts simultanément
    Par matrixfan dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/05/2002, 17h47
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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