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 :

Comportement étrange de rand() et RAND_MAX


Sujet :

C

  1. #1
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut Comportement étrange de rand() et RAND_MAX
    Salut à tous..

    Un truc bizarre, en essayant d'aider un posteur :

    Il utilise la fonction rand() et comme de bien entendu effectue

    pour avoir un nombre entre 0 et 1.

    • Sur Linux, aucun problème.
    • J'essayes sur cygwin (mingw d'il y a 2 mois), et ça me donne un rand du style 578531879 ou 1270744533, mais pour RAND_MAX ça me donne 32767..




    Une idée quelqu'un ?????
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 64
    Points
    64
    Par défaut
    tes valeurs tu les a récupéré dans par un debugger ou par une sortie style printf?
    si derniére proposition ça peux venir d'une mauvaise association de type de ta part...

  3. #3
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par souviron34
    Salut à tous..

    Un truc bizarre, en essayant d'aider un posteur :

    Il utilise la fonction rand() et comme de bien entendu effectue

    pour avoir un nombre entre 0 et 1.

    • Sur Linux, aucun problème.
    • J'essayes sur cygwin (mingw d'il y a 2 mois), et ça me donne un rand du style 578531879 ou 1270744533, mais pour RAND_MAX ça me donne 32767..




    Une idée quelqu'un ?????
    Pour avoir une valeur entre 0 et 1, je ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rand()/(float)(RAND_MAX)
    Evidemment, le résultat est un flottant.
    Mais bon, je ne pense pas que ton problème vienne de là...
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par crocodilex
    Pour avoir une valeur entre 0 et 1, je ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rand()/(float)(RAND_MAX)
    Evidemment, le résultat est un flottant.
    Mais bon, je ne pense pas que ton problème vienne de là...

    Non ça ne vient pas de là...

    Si je mets INT_MAX à la place de RAND_MAX, ça marche....

    Serait-ce un bug chez mingw ? Avez-vous la même chose ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Points : 284
    Points
    284
    Par défaut
    Que je sache, minGW != cygwin, non ?

    J'ai essayé avec MinGW32, gcc version 3.4.2. Tous mes rand() donne un résultat inférieur à RAND_MAX (qui vaut effectivement 32767).

    Peut-être as-tu mélangé 2 compilateurs différents (si MinGW et Cygwin sont bien distincts), ou 2 versions différentes du même compilateur. Et si c'est du C++, il y a aussi un std::rand() qui est peut-être encore différent.

  6. #6
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Ulmo
    Que je sache, minGW != cygwin, non ?

    J'ai essayé avec MinGW32, gcc version 3.4.2. Tous mes rand() donne un résultat inférieur à RAND_MAX (qui vaut effectivement 32767).

    Peut-être as-tu mélangé 2 compilateurs différents (si MinGW et Cygwin sont bien distincts), ou 2 versions différentes du même compilateur. Et si c'est du C++, il y a aussi un std::rand() qui est peut-être encore différent.
    Cygwin n'est pas un compilateur. C'est un environnement "Linux-like" qui tourne sous windows.
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  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 souviron34
    pour avoir un nombre entre 0 et 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include<stdio.h>
    #include<stdlib.h>
     
    int main (void)
    {
       srand ((unsigned) time (NULL));
       int i;
       for (i = 0; i < 10; i++)
       {
          printf ("rnd = %f\n", (double) rand () / RAND_MAX);
       }
       return 0;
    }
    Avec MinGW :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    rnd = 0.457717
    rnd = 0.658315
    rnd = 0.214301
    rnd = 0.738395
    rnd = 0.093448
    rnd = 0.236213
    rnd = 0.714652
    rnd = 0.466964
    rnd = 0.424116
    rnd = 0.079592
     
    Press ENTER to continue.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Effectivement, Emmanuel....

    Mais je ne comprends pas, j'avais compilé avec les otpions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -march=athlon-xp  -mno-cygwin -mwindows
    et ça donne ce que je disais ci-dessus.

    Si j'enlève le -mno-cygwin -mwindows (qui était censé se passer de cygwin.dll et utiliser les dll de Windows ainsi que les appels systèmes Windows), ça marche...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Points : 284
    Points
    284
    Par défaut
    Pour ma part, utiliser -mwindows fait que les printf ne marchent plus...

  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 Ulmo
    Pour ma part, utiliser -mwindows fait que les printf ne marchent plus...
    Ca me parait bien tordu toutes ces manips. Pourquoi ne pas utiliser MinGW directement à la ligne de commande (unix-g33k, make etc.) ou encore Code::Blocks et c'est tout. L'IDE fait son travail comme il faut...

    Y'a pas à se compliquer avec des unix-like sous Windows... On est plus au moyen age...
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Points : 284
    Points
    284
    Par défaut
    J'essayais juste pour voir. On n'est plus au moyen age, mais je reste curieux

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ca me parait bien tordu toutes ces manips. Pourquoi ne pas utiliser MinGW directement à la ligne de commande (unix-g33k, make etc.) ou encore Code::Blocks et c'est tout. L'IDE fait son travail comme il faut...

    Y'a pas à se compliquer avec des unix-like sous Windows... On est plus au moyen age...
    je comprends pas ta remarque. C'était dans un makefile, c'était juste les options de compile. Et justement, quand j'avais mis les flags, c'était pour essayer d'avoir du code ne se servant pas de la cygwin dll, mais uniquement des fonctions Windows.

    Et en fait, si j'utilisais cygwin, c'est que je me sers de xemacs, comme sour Linux/Unix, et que j'ai des applis X.

    Voilà.
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 15h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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