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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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