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++

Vue hybride

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

  4. #4
    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

  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
    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.

  6. #6
    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.

  7. #7
    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

+ 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