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 :

Problème fonction random avec linux


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 21
    Par défaut Problème fonction random avec linux
    Bonjour,
    J'ai un petit problème avec la fonction rand() sous linux. Je déclare bien la bibliothèque (#include <stdlib.h>).

    J'initialise le rand() avec srand(time(NULL));

    Et j'écris la formule suivante.
    X=1+(int) ((largeur-1)*rand()/(RAND_MAX+1.0));

    Et ça me retourne à chaque fois 1.
    Ce qui m'étonne, c'est que cela marche sous windows.

    Merci.

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    largeur vaut peut etre 1

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Non, j'ai rien dit
    C'est juste que tu divises par RAND_MAX donc ça te sort un entier qui vaut toujours 0 (si tu avais casté en double, la valeur aurait été comprise entre [0, 1[)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 21
    Par défaut
    la doc de mon Kdevelop me dit de faire ça :

    "If you want to generate a random integer between 1 and 10, you should always do it by using high-order bits, as in j=1+(int) (10.0*rand()/(RAND_MAX+1.0));

  5. #5
    Invité
    Invité(e)
    Par défaut
    Tout simplement, je crois.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 21
    Par défaut
    Oui celui la marche, mais la doc dit :

    "If you want to generate a random integer between 1 and 10, you should always do it by using high-order bits, as in j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
    and never by anything resembling j=1+(rand() % 10);
    (which uses lower-order bits)."

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je dois avouer que je ne sais pas pourquoi il ne faut pas le faire... jamais eu de problemes avec ca !
    Si quelqu'un a une reponse ca m'interesse aussi.

  8. #8
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    C'est quoi cette histoire de high-order et low-order bits?
    Bon ptet que le fait de passer par des flottants rajoute un peu d'aleatoire à tout ça

  9. #9
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Gruik
    C'est quoi cette histoire de high-order et low-order bits?
    Bon ptet que le fait de passer par des flottants rajoute un peu d'aleatoire à tout ça
    C'est une discussion recurrente sur ce forum.
    Jean-Marc Bourguet a ecrit un petit document qui explique cela (voir la section 4.2, notamment).

  10. #10
    Invité
    Invité(e)
    Par défaut
    Un peu trop eleve pour moi.... je garde mon bon vieux modulo, pour ce que j'en fais hein ^_^

  11. #11
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par DaZumba
    C'est une discussion recurrente sur ce forum.
    Jean-Marc Bourguet a ecrit un petit document qui explique cela (voir la section 4.2, notamment).
    Merci, interessant
    Donc, c'est en gros, c'est pas que "rand() % (max+1)" est mal mais c'est juste pas suffisament aleatoire, c'est ça?

  12. #12
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Gruik
    Merci, interessant
    Donc, c'est en gros, c'est pas que "rand() % (max+1)" est mal mais c'est juste pas suffisament aleatoire, c'est ça?
    Il y a plusieurs problèmes:
    • si max+1 n'est pas un diviseur de RAND_MAX+1, il y a un biais pour les valeurs petites d'autant plus important que RAND_MAX/max est petit;
    • ça utilise les bits de poids faibles qui sont moins aléatoires avec certains générateurs; je ne sais pas dans quelle mesure ils sont encore utilisés sans corrections -- sous Linux il y a des corrections pour ce problèmes
    • si max saut MAX_INT, il y a un débordement, ce n'est un risque que si max est un paramètre d'une routine

  13. #13
    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 NaeiKinDus
    Tout simplement, je crois.
    Solution naive. Lire la FAQ C

Discussions similaires

  1. problème fonction mail() avec PHP 5.2 et IIS6
    Par Aliximo dans le forum IIS
    Réponses: 0
    Dernier message: 05/06/2008, 12h19
  2. problème fonction php avec connexion postgreSQL
    Par roblescriso dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/06/2008, 18h02
  3. Problème fonction perso avec Decaler
    Par stryge63 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/02/2008, 09h40
  4. simuler la fonction random avec rand
    Par k6971 dans le forum Langage
    Réponses: 2
    Dernier message: 11/12/2006, 19h33
  5. [MySQL] problème fonction php avec LAST_INSERT_ID()
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/12/2006, 09h51

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