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 avec srand() et rand()


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut Problème avec srand() et rand()
    Bonjour,

    Je fais un programme qui est lié à de la finance, on calcule entre autre un brownien, etc...
    Dans ce programme, je dois faire appel à la fonction rand(), et donc à la fonction srand().

    Voici le programme :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    #include <iostream>
    #include <cmath>
    #include <fstream>
    #include <time.h>
     
    using namespace std;
     
    const int M=365;
    const double sigma=0.2,r=0.1;
    const double dt=1.0/(double)M;
    //const double pi=M_PI;
    const double pi=3.14159265;
    const double pi4=4.0*pi;
    const double sdt=sqrt(dt);
    double S[M];
    double Sinitial;
    double T=1; // 1 année ==> pas sur ! 
    double K=100;
    int N=2000;
     
     
    double maximum(double a, double b)
    {
    	if(a>b) return a;
    	else return b;
    }
     
    double gauss(){
    double x,y,z;
    x=(rand())/((double)RAND_MAX);
    y=(rand())/((double)RAND_MAX);
    z=sqrt(-2.0*log(x))*cos(2.0*pi*y);
    return z;
    }
     
    void ED0stoch( const int m){
    for(int i=0;i<m;i++){
    S[i+1]=S[i]*(1.0+r*dt+gauss()*sdt);
     
    }
    }
     
     
    int main()
    {
    srand(time(NULL));
     
    double P0=0; // Valeur du contrat
    double moy_ST=0; // moyenne des S_T
     
    cout<<"Entrez une valeur de S0 : ";
    cin>>Sinitial;
     
    S[0]=Sinitial;
    ED0stoch(M-1);
     
    cout<<endl;
    cout<< "Valeur de S au bout d'un an : ";
    cout<<S[M-1]<<endl;
    cout<<endl;
     
     
    for(int k=1;k<=N;k++)
    {
    //srand(time(NULL));
    S[0]=Sinitial;
    ED0stoch(M-1);
    cout<<"S[M-1]="<<S[M-1]<<endl;
    P0=P0+exp(r*T)*maximum(K-S[M-1],0);
    cout<<P0 <<endl;
    moy_ST=moy_ST+S[M-1];
    }
     
    P0=P0/N;
     
    cout<<" Valeur de P0="<<P0<<endl;
    cout<<" Moyenne des S[M-1] (=ST) : "<<moy_ST/N<<endl;
     
     
    ofstream ff("fichier.txt"); // stockage des données
    	for(int i=0;i<M-1;i++)
    		ff<<i<<"  "<<S[i]<<endl;
    cout<<endl;
    cout<<"Les donnees sont stockees dans le fichier 'fichier.txt'"<<endl;
     
    return 0;
    }
    L'initialisation de srand() est faite dans le main par la commande : srand(time(NULL));

    Ensuite, je fais appel dans mon programme à une fonction EDOstoch qui aura besoin entre autre de rand().
    Ce qui nous intéresse particulièrement est la valeur de S en M-1, c'est à dire S[M-1].

    Mon problème vient lors de l'execution de la boucle suivante ( qui permet de calculer la valeur d'une option put européenne ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for(int k=1;k<=N;k++)
    {
    //srand(time(NULL));
    S[0]=Sinitial;
    ED0stoch(M-1);
    cout<<"S[M-1]="<<S[M-1]<<endl;
    P0=P0+exp(r*T)*maximum(K-S[M-1],0);
    cout<<P0 <<endl;
    moy_ST=moy_ST+S[M-1];
    }
    Si je mets un srand(time(NULL)); à l'intérieur de cette boucle, je vais avoir toujours le même résultat pour S[M-1], ce qui est logique.
    J'ai donc supprimé le srand à l'intérieur de la boucle, mais le problème c'est que j'ai des résultats étranges pour S[M-1] : certaines valeurs sont infinies.
    Ma fonction EDOstoch semble marcher correctement, donc je pense que celà vient de l'utilisation de rand() et srand(), mais je n'en suis pas sur du tout.

    Est ce qu'il y a quelque chose qui cloche dans mon programme avec l'utilisation de srand() et rand() ?

    Je vous remercie.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double gauss(){
    double x,y,z;
    x=(rand())/((double)RAND_MAX);
    y=(rand())/((double)RAND_MAX);
    z=sqrt(-2.0*log(x))*cos(2.0*pi*y);
    return z;
    }
    log(x) n'est pas définie quand x = 0.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035

  4. #4
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x=(rand())/((double)RAND_MAX);
    y=(rand())/((double)RAND_MAX);
    ces nombres peuvent valoir 0 .

    voir le lien pdf dans la faq à ce sujet :
    http://www.bourguet.org/cpp/random.pdf

    EDIT : arf deja répondu, c'est ça d'ecrire un sujet en lisant d'autres trucs... désolé

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    Ah mais oui, bien sur, quel idiot !

    Merci à vous, je vais lire les fichiers que vous m'avez donnés

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    C'est bon, mon problème est résolu, j'ai remplacé la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x=(rand())/((double)(RAND_MAX));
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x=(1+rand())/((double)(1+RAND_MAX));
    Merci.

  7. #7
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    euh là ça marchera, il n'y a plus de 0, mais a/b n'est pas égal à a+1/b+1 (presque si a et b sont grands, mais bon...), je veux dire par là que si ton programme a pour vocation d'être professionel, les valeurs obtenues ne seront pas (ou plutot encore moins) aléatoires qu'avant.
    si c'est pour du professionel je te conseille de voir pour un générateur de nombre aléatoires plus performants, et en tout cas de faire attention aux biais statistiques, etc... (par exemple avec les liens de MonGaulois.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    C'est pour un projet scolaire, pas du tout professionnel en l'occurence

    Avec cette commande là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x=(1+rand())/((double)(1+RAND_MAX));
    Je génère bien un nombre aléatoire dans ]0,1], non ?

  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
    Citation Envoyé par rouliane Voir le message
    C'est pour un projet scolaire, pas du tout professionnel en l'occurence

    Avec cette commande là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x=(1+rand())/((double)(1+RAND_MAX));
    Je génère bien un nombre aléatoire dans ]0,1], non ?
    Pour autant que RAND_MAX soit différent de INT_MAX, ce qui n'est pas le cas sous Linux par exemple.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 180
    Par défaut
    Ok.
    Comment je peux faire alors j'ai trouvé que ça...

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x=(1.0+rand())/(1.0+RAND_MAX);

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

Discussions similaires

  1. Problème avec srand
    Par yopiyop33 dans le forum Débuter
    Réponses: 5
    Dernier message: 02/12/2014, 18h38
  2. [PHP 5.3] Exception avec srand & rand: aucun résultat
    Par max235 dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2010, 21h25
  3. Démineur : problème avec la fonction rand
    Par hazaki dans le forum Débuter
    Réponses: 3
    Dernier message: 10/12/2010, 21h24
  4. [MySQL] Problème avec Rand()
    Par Narutosaad dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/07/2010, 15h45
  5. [Valeur aléatoire] Problème avec rand()
    Par Machjaghjolu dans le forum C++
    Réponses: 4
    Dernier message: 06/12/2005, 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