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 :

srand() et librairie


Sujet :

C

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut srand() et librairie
    Bonjour, dans une fonction que j'ai intégrée à une librairie dynamique, je tire des nombres aléatoires suivant une loi de Weibull (fonction utilisant des nombres aléatoires suivant une loi uniforme sur [0, 1]). Quand je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(i = 0 ; i < 10 ; i++)
    {
      srand(10);
      d = wblrnd(...);
    }
    j'obtiens 10 valeurs différentes ! En revanche, si je mets le srand(10) DANS la fonction qui est dans la librairie, j'ai bien les mêmes nombres.

    Ma question est : pourquoi est-ce qeu srand() n'est pas connu dans la librairie ?

    Merci d'avance

  2. #2
    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 salseropom Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(i = 0 ; i < 10 ; i++)
    {
      srand(10);
      d = wblrnd(...);
    }
    Non.

    http://emmanuel-delahaye.developpez....=Page7#LXXXVII

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut Emmanuel,

    dans le code que j'ai écrit, je désirais avoir 10 fois le même nombre aléatoire, d'où la présence du srand(10) DANS la boucle for... ceci n'est qu'un test. Mais malgré ce srand(10) dans la boucle for, j'obtiens 10 nombres différents. Je rappelle que wblrnd() est une fonction que j'ai écrite et qui est dans une librairie.

    Ma question est donc : pourquoi malgré ce srand(10) DANS la boucle for j'ai 10 valeurs différentes ?

  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 salseropom Voir le message
    Salut Emmanuel,

    dans le code que j'ai écrit, je désirais avoir 10 fois le même nombre aléatoire,
    Que peut bien signifier 'avoir 10 fois le même nombre aléatoire. Si c'est le même, tu fais un tirage et tu l'utilise 10 fois. Il ne faut pas faire 10 tirages...
    d'où la présence du srand(10) DANS la boucle for... ceci n'est qu'un test. Mais malgré ce srand(10) dans la boucle for, j'obtiens 10 nombres différents. Je rappelle que wblrnd() est une fonction que j'ai écrite et qui est dans une librairie.

    Ma question est donc : pourquoi malgré ce srand(10) DANS la boucle for j'ai 10 valeurs différentes ?
    Alors ça vient de la fonction.

    Je commence à comprendre ce que tu veux faire. Tu es sûr que ta fonction est basée sur rand() ?

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    n1256 :
    7.20.2 Pseudo-random sequence generation functions
    7.20.2.1 The rand function
    Synopsis
    1 #include <stdlib.h>
    int rand(void);
    ....
    3 The implementation shall behave as if no library function calls the rand function.
    ....
    7.20.2.2 The srand function
    Synopsis
    1 #include <stdlib.h>
    void srand(unsigned int seed);
    ....
    3 The implementation shall behave as if no library function calls the srand function.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Bonjour à vous deux et merci de vos réponses.

    Emmanuel, voici mon code :

    mon fichie aleatoire.c (qui fait partie de ma librairie)
    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
     
    /* 
       RAND is a macro which returns a pseudo-random numbers from a uniform
       distribution on the interval [0 1]
     */
    #define RAND ((rand())/((double) RAND_MAX))
     
    /*******************************************************************************
     * wblrnd : returns a pseudo-random number chosen from the Weibull distribution*
     * with scale parameter lambda > 0, shape parameter k > 0 and localisation     *
     * parameter theta                                                             *
     *******************************************************************************/
    EXTERN_C RISOTO_API double __stdcall wblrnd(double k,double lambda,double theta)
    {
      double d;
      do
      {
        d = RAND;
      }
      while(d < DBL_EPSILON);
     
      return lambda * pow(-log(d),1./k) + theta;
    }
    Dans une autre fonction en gros je calcule

    wblrnd(k,lambda,theta) ou bien
    theta + wblrnd(k,lambda,theta) ou bien
    theta - wblrnd(k,lambda,theta)

    donc si theta == 0 je suis sensé obtenir les mêmes réponses, ce qui n'est pas le cas... Pourtant j'ai bien forcé à avoir les mêmes nombres avec mon srand(10) ==> mais je suis tout à fait d'accrod avec toi que mettre le srand(10) dans la boucle "for" n'a aucun intérêt, sauf pour mon test...

    Si je mets mon srand(10) dans ma fonction wblrnd() qui est dans la librairie, j'ai bien les même valeurs... ce qui me rassure.

    Diogène :

    que dois-je faire alors ?

    Merci encore de vos réponses

  7. #7
    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 salseropom Voir le message
    Bonjour à vous deux et merci de vos réponses.

    Emmanuel, voici mon code :

    mon fichie aleatoire.c (qui fait partie de ma librairie)
    La bibliothèque est-elle une DLL ?

    : Question générale 'Windows' : Une DLL est-elle un processus ?

    A ma connaissance, non... Donc, je ne vois pas où est le problème. srand() devrait agir sur la même graine, que rand() soit appelée par le programme principal ou par une fonction de la DLL.

    Par contre si ce sont 2 processus différents, il y a 2 graines (une par processus). Vive les threads...

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    La bibliothèque est-elle une DLL ?

    : Question générale 'Windows' : Une DLL est-elle un processus ?
    oui, je livre une DLL.

    concernant ta question DLL et processus, je vais me renseigner auprès de qq personnes qui m'ont bien l'air calé sur ces sujets.

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Si la libc est liee statiquement dans la DLL et que l'appli utilise un autre exemplaire, ca pourrait expliquer, non? (Aucune idee de si c'est possible sous Windows).

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Question générale 'Windows' : Une DLL est-elle un processus ?
    Dit comme ça, c'est un NON ferme, mais si tu veux savoir si une DLL peut avoir ses propres exemplaires des variables "globales" de la libc (C Run-Time Library, ou CRT), la réponse est oui.
    Sur le coup, je vois quatre situations possibles, dont trois prouvées:
    • Chaque DLL est compilée en CRT statique, donc possède son propre exemplaire de la CRT.
      Solution: Faire abattre le gars qui a compilé une ou plusieurs DLLs en CRT statique.
    • Chaque DLL est compilée en CRT dynamique, mais l'exe est compilé en CRT statique. Une erreur commune, mais qui fait qu'il y a deux exemplaires présents dans le même processus.
    • Tout est compilé en dynamique, mais il y a conflit de versions majeures: Plusieurs versions de la CRT sont (peut-être?) chargées en mémoire dans le même processus. En fait, je ne sais même pas si c'est vraiment le cas.
    • Tout est compilé en CRT dynamique avec la même version majeure: Il n'y a qu'un seul exemplaire dans le processus, celui qui possède la plus haute version mineure.

    Généralement, les problèmes qui se posent se matérialisent avec les allocations mémoire et les flux (tout ce qui est alloué par une DLL doit être détruit par la même DLL, et pour les flux c'est encore plus restrictif). Je n'avais jamais réfléchi aux implications pour rand() et d'autres fonctions non-réentrantes...

    Edit: Note pour le multi-thread: À part le tas qui est synchronisé (et les flux), les variables statiques de la CRT sont spécifiques à chaque thread. Ainsi, toutes les fonctions non-réentrantes (strtok(), rand()) sont au moins thread-safe sous Windows.
    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.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Bonjour,

    merci pour vos réponses. J'ai donc discuté avec un collègue et il m'a dit que dans le cas d'une DLL (et non d'une lib statique), il y avait un espace mémoire qui lui était réservé, du coup, srand() pouvait ne pas être "vu" par la DLL.

    Bon, je ne maitrise pas ce sujet mais ce que je retiens c'est que srand() ne s'applique pas dans le cadre d'une DLL (à moins de mettre une fonction srand() dans la DLL et d'appeler celle-ci le cas échéant...)

    Merci de vos explications.

  12. #12
    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 salseropom Voir le message
    Bon, je ne maitrise pas ce sujet mais ce que je retiens c'est que srand() ne s'applique pas dans le cadre d'une DLL (à moins de mettre une fonction srand() dans la DLL et d'appeler celle-ci le cas échéant...)
    Oui, et c'est prévu. il y a un dllmain() (quelque soit son nom exact) qui est fait pour. C'est du code qui est lancé une fois au chargement de la DLL.

    Par défaut, il est vide. Tu peux y placer un appel à srand(). (avec time() pour avoir une valeur différente à chaque exécution, comme déjà expliqué).

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

Discussions similaires

  1. [librairies standard]slang.h et curses.h
    Par miss8 dans le forum Réseau
    Réponses: 13
    Dernier message: 27/12/2002, 10h14
  2. inclure une librairie *.lib
    Par darkbm dans le forum C
    Réponses: 2
    Dernier message: 16/12/2002, 22h48
  3. Réponses: 5
    Dernier message: 09/12/2002, 22h23
  4. [GTK]PB Librairie GTK+ sous dev-c++
    Par wozzy dans le forum Dev-C++
    Réponses: 15
    Dernier message: 05/11/2002, 14h55
  5. compatibilité des librairies directX8
    Par Freakazoid dans le forum DirectX
    Réponses: 3
    Dernier message: 23/05/2002, 21h33

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