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 drand48() et sdrand48()


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4
    Par défaut Problème fonction drand48() et sdrand48()
    Bonsoir à tous,

    Je veux générer en langage C un nombre aléatoire réel entre 0 et 1. Pour cela, je dois utiliser la fonction "drand48()" mais je n'arrive pas à la faire fonctionner.

    En effet, avec le logiciel Dev-C++ j'ai un message d'erreur "'drand48' undeclared (first use this function)" et "sdrand48' undeclared (first use this function)"
    Y a-t-il une librairie (header) ou une fonction spécifique à utiliser ?

    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>     /*librairie pour fonction printf()*/
    #include <time.h>      /*libraire pour fonction time()*/
    #include <conio.h>     /*librairie pour fonction getch()*/
     
    #include <stdlib.h>    /*essais de*/
    #include <math.h>      /*librairie*/
    #include <float.h>     /*pour les fonctions*/
    #include <sys/time.h>  /*drand48() et sdrand48()*/
     
    int main()
    {
    sdrand48(time(NULL));   /*initialisation graine*/
    printf("%f",drand48()); /*valeur aléatoire réelle entre 0 et 1*/
    getch();
    return 0;
    }
    Merci de votre aide.

  2. #2
    Membre éclairé
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Par défaut
    Il me semble que ces fonctions sont disponibles essentiellement pour linux (dans stdlib.h). Essaie de voir si tu peux pas installer la libc avec dev-c++.
    Sinon tu peux toujours utiliser rand() et srand().

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4
    Par défaut
    Merci pour la réponse.
    Le cahier des charges de mon université mentionne bien l'utilisation de la fonction drand48() en langage C.
    Quelle libc à installer sous Dev-C++ ?

  4. #4
    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 rageforce
    Merci pour la réponse.
    Le cahier des charges de mon université mentionne bien l'utilisation de la fonction drand48() en langage C.
    La personne qui a écrit ce cahier des charges est un ane. Il n'y a pas de drand48() en C standard.
    Quelle libc à installer sous Dev-C++ ?
    Aucune idée.

    Je ferais discrètement

    #define drand48() rand() etc.

  5. #5
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    http://www.opengroup.org/onlinepubs/007908799/xsh/drand48.html
    Bref, du pas portable (du genre même pas entre *n*x... C'est du SVID 3 : donc tout système n'implantant pas directement ça, ou n'implantant pas System V ne les aura pas...)

    Autant faire la ruse de sioux de Manu
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  6. #6
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    j'ai bien peur que la ruse ne fonctionne pas :

    drand48() retourne un double et rand retourne un int.

  7. #7
    Expert confirmé

    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
    Par défaut
    drand48() retourne un double et rand retourne un int.

    Tant qu'à faire des choses sioux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define srand48(t) srand(t)
    #define drand48() ((double)rand()/RAND_MAX)
    Jc

  8. #8
    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 PRomu@ld
    j'ai bien peur que la ruse ne fonctionne pas :

    drand48() retourne un double et rand retourne un int.
    Je me suis contenté d'indiquer une piste...

  9. #9
    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 fearyourself
    drand48() retourne un double et rand retourne un int.

    Tant qu'à faire des choses sioux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define srand48(t) srand(t)
    #define drand48() ((double)rand()/RAND_MAX)
    Jc
    ... que certains courageux n'hésitent pas à emprunter...

  10. #10
    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 fearyourself
    drand48() retourne un double et rand retourne un int.

    Tant qu'à faire des choses sioux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define srand48(t) srand(t)
    #define drand48() ((double)rand()/RAND_MAX)
    Jc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define drand48() ((double)rand()/((double)RAND_MAX+1))
    Alors. drand48 ne renvoie jamais 1.

  11. #11
    Expert confirmé

    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
    Par défaut
    ... que certains courageux n'hésitent pas à emprunter...
    Tant qu'à faire du sport...

    En faisant ce genre de délire, on peut gagner le prix du code le plus moche, c'est pas mal sur un CV, non?

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4
    Par défaut
    Suite à une info que j'ai reçue par ailleurs, voici un autre code qui permettrait de simuler la fonction drand48() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdlib.h>
    #include <time.h>
    float drand48()
    {
    return (float)rand()/(float)RAND_MAX;
    }
    int main()
    {
    srand(time(NULL));
    drand48( ... );
    ...
    }
    Je pense qu'il rentre aussi dans la catégorie "bricolage"

  13. #13
    Expert confirmé

    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
    Par défaut
    Je pense qu'il rentre aussi dans la catégorie "bricolage"
    C'est déjà mieux que ce que j'ai proposé

    Par contre pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (float)rand()/(float)RAND_MAX;
    tu peux enlever un des "(float)", un seul suffit...

    Jc

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4
    Par défaut
    Oui tu as raison : a/b --> pour que le résultat soit réel il suffit juste que a ou b soit réel.
    Je retire donc un "float" de l'expression.

  15. #15
    Membre confirmé Avatar de Marco85
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 210
    Par défaut
    Citation Envoyé par rageforce
    Oui tu as raison : a/b --> pour que le résultat soit réel il suffit juste que a ou b soit réel.
    Je retire donc un "float" de l'expression.
    Salut rageforce !!!

    Je préférerais l'expression "nombre à virgule flottante" plutôt que réel ...
    Mais je suis d'accord avec le reste de ta remarque ...

    Marco85

  16. #16
    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 rageforce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <stdlib.h>
    #include <time.h>
    float drand48()
    {
    return (float)rand()/(float)RAND_MAX;
    }
    Je ne vois pas de différence fondamentale avec la macro présentée par fearyourself. Pour les détails, elle a le même défaut de pouvoir retourner 1.0; elle a les défauts supplémentaires que si RAND_MAX est assez important, on perd une partie de l'aléa présent dans rand() et de ne pas avoir le prototype auquel on s'attend pour drand48 (autrement dit il faudrait retourner un double); elle a l'avantage d'être une fonction (donc on peut prendre son adresse), mais vu le problème du prototype, c'est guère utile.

Discussions similaires

  1. Problème : Fonctions et commande Execute
    Par bubi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/11/2005, 11h01
  2. Problème fonction SDL
    Par seeme dans le forum SDL
    Réponses: 2
    Dernier message: 06/11/2005, 20h22
  3. Problème fonction PL/SQL
    Par SSJ17Vegeta dans le forum PL/SQL
    Réponses: 2
    Dernier message: 29/10/2005, 21h14
  4. Problème fonction et trigger sous 7.2
    Par anoukhan dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/06/2005, 22h53
  5. Réponses: 2
    Dernier message: 20/08/2004, 17h10

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