Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Comment générer aléatoirement des réels sur C++ Builder ?



  1. #1
    Hoopsy

    Comment générer aléatoirement des réels sur C++ Builder ?


    ------

    Bonsoir à tous.

    Voilà, au cours de mon PFE je doit générer aléatoirement un nombre fini de réels qui représentent des volatilités et il faut qu'ils soient entre 0 et 1 ; je n'arrive pas à trouver la fonction qui me permet de le faire donc si quelqu'un à une idée j'aimerais bien la connaitre.

    Merci d'avance !!!

    -----

  2. Publicité
  3. #2
    umfred

    Re : Comment générer aléatoirement des réels sur C++ Builder ?

    il faut utiliser la fonction rand() qui se trouve déclarée dans stdlib.h (qu'il ne pas oublier d'inclure).

  4. #3
    fderwelt

    Re : Comment générer aléatoirement des réels sur C++ Builder ?

    Citation Envoyé par umfred Voir le message
    il faut utiliser la fonction rand() qui se trouve déclarée dans stdlib.h (qu'il ne pas oublier d'inclure).
    Mais rand() renvoie un entier... Il faut diviser le résultat par RAND_MAX en n'oubliant pas de tout convertir en flottant.

    -- françois
    Les optimistes croient que ce monde est le meilleur possible. Les pessimistes savent que c'est vrai.

  5. #4
    Hoopsy

    Re : Comment générer aléatoirement des réels sur C++ Builder ?

    Salut,

    J'ai essayé le code source et ça marche vraiment très bien mais le hic est que ça me donne toujours les mêmes réels si j'exécute à nouveau.

    Merci de m'avoir répondu.

    A bientôt.

  6. #5
    fderwelt

    Re : Comment générer aléatoirement des réels sur C++ Builder ?

    Citation Envoyé par Hoopsy Voir le message
    J'ai essayé le code source et ça marche vraiment très bien mais le hic est que ça me donne toujours les mêmes réels si j'exécute à nouveau.
    Bonjour,

    C'est normal, c'est un générateur pseudo-aléatoire: avec les mêmes conditions initiales il donnera toujours la même séquence (ce qui permet de faire des tests parfaitement reproductibles tout en étant "statistiquement" aléatoires).
    Il faut utiliser la fonction srand() pour initialiser le générateur, par exemple avec la valeur de l'horloge, ou quelque chose de relativement imprévisible.

    -- françois
    Les optimistes croient que ce monde est le meilleur possible. Les pessimistes savent que c'est vrai.

  7. A voir en vidéo sur Futura
  8. #6
    Hoopsy
    Salut François,

    Pour la fonction srand(unsigned seed) il faut que la valeur entre parenthèses soit entière. J'ai essayé d'avoir le temps à partir du composant DateTimePicker->Time mais le problème ça me donne aussi la date.

    Je pense que ça va toujours nous donner les mêmes valeurs parceque quand on choisit le "seed" le générateur va s'initialiser à partir de cette valeur.

    Si je prends le "seed" comme le temps j'aurais toujours les mêmes valeurs car dans mon programme j'ai des instructions qui se suivent et elles peuvent s'exécuter en une seconde.

    Merci pour votre réponse.

    A bientôt

  9. Publicité
  10. #7
    Philder

    Re : Comment générer aléatoirement des réels sur C++ Builder ?

    Salut,

    pour le seed, l'idee c'est que tu mets l'heure actuelle (en secondes en general) comme ca selon le moment auquel tu executes ton programme tu auras differentes valeurs du generateur. Le principe general c'est que tu execute srand(heure actuelle en secondes) au debut du programme et apres tu fais du rand.
    Pour avoir le temps regardes plutot les fonctions standard dans time.h .

  11. #8
    Hoopsy
    Bonsoir,

    Je n'ai pas trouvé la fonction "time.h" même dans le Help. Voici un exemple de ce que j'ai fais :

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Edit1->Text=(double)rand()/(double)RAND_MAX;
    }

    Avez-vous une idée sur comment utiliser la fonction "time.h" dans un programme comme celui la ?

    A bientôt

  12. #9
    fderwelt

    Re : Comment générer aléatoirement des réels sur C++ Builder ?

    Bonjour,

    Je pense que je commence à comprendre ton problème. Il y a deux points:
    - d'une part, tu as besoin d'un générateur (pseudo)aléatoire, et la fonction rand() est exactement faite pour ça,
    - d'autre part, tu voudrais que ce ne soit pas reproductible.
    Sur ce point, la fonction rand() engendre les 232-1 nombres binaires non nuls qui tiennent dans un registre de Pentium, dans un ordre qui présente toutes les caractéristiques statistiques que l'on peut attendre d'un tirage aléatoire. J'ai pas mal d'expérience des logiciels de simulation, et je peux t'assurer que tant que tu n'as besoin que de quelques dizaines de milliers, voire de quelques millions, de points, cette fonction est très satisfaisante.
    Maintenant, ton problème est d'initialiser le générateur. Il est d'usage (et par commodité) d'utiliser l'horloge de l'ordinateur, précisément parce que l'heure change tout le temps... Mais si l'heure n'est accessible qu'à la seconde près, il y a risque de réplique.
    J'ai construit et expérimenté, il y a une quinzaine d'années, un vrai générateur aléatoire: un teransistor monté en Zener inverse, avec un ampli-op pour ajuster le niveau du signal, et un convertisseur analogique/numérique pour fabriquer un nombre binaire. Le transistor (du moins sa jonction base-émetteur) est sujet à un bruit blanc quantique, et là pas question d'initialisation... On obtient quelques dizaines de milliers d'échantillons par seconde, voire plus si on met le prix sur le convertisseur A/N.
    Mais ça ne me semble pas être ton problème. Sur 32 bits, la fonction rand() va engendrer un peu plus de 4 milliards de valeurs distinctes. Et il te faut cette quantité plusieurs fois par seconde? Tu sais que les sondages pour les élections présidentielles n'ont pas un échantillonnage pareil...
    Admettons que tu aies besoin réellement de ça. Alors tu peux t'écrire ton propre générateur sur 64 bits (Borland C++ Builder connaît très bien les types __int64 et __uint64), il te faut juste un polynôme minimal de ce degré, je n'en ai pas sous le coude mais ça se trouve sans difficulté en googlant.
    Accessoirement, PGP utilise un polynôme de 128 bits, et le code de la NSA à 512 bits a été cassé au milieu des années '90 après plusieurs mois de calcul de plusieurs super-calculateurs... Et il est légalement interdit d'utiliser des polynômes de plus de 256 bits sans le déclarer à la DST, l'OTAN et la CIA, sinon tu es soupçonné d'espionnage, même si c'est pour transmettre tes veoux à ta fiancée, le fait que ce soit crypté te rendra suspect.
    J'aimerais donc avoir plus de détails sur ce que tu cherches à faire, qui, je pense, est tou à fait honnête e moral!

    -- françois
    Les optimistes croient que ce monde est le meilleur possible. Les pessimistes savent que c'est vrai.

  13. #10
    Hoopsy
    Salut François,

    J'ai bien compris ce que vous m'avez écrit. Je vous explique ce que je cherche :

    L'objectif de mon travail est de concevoir un logiciel qui me permettra de calculer la volatilité des prix d'option de manière précise.

    Pour cela, je vais appliquer un algorithme de calibration qui a été développé par l'INRIA. Au départ j'ai un domaine [t0, Tmax]*[ymin, ymax] tel que : T représente les échéances et k les strikes avec y=ln(k).

    Je fais une discrétisation non uniforme du domaine pour avoir plusieurs points qui appartiennent à ce domaine et je dois calculer le prix des options dans chaque point de la grille. Par conséquent, je dois aussi calculer la volatilité dans chaque point de la grille.

    Pour ce faire, je paramètre la volatilité par des splines bicubiques et c'est pour cela que je dois simuler des volatilités qui se trouvent sur le périmètre de la grille pour que je puisse calculer celles qui sont à l'intérieur. Donc je vais paramétrer ces points par la fonction d'interpolation et ainsi je pourrai calculer la volatilité dans chaque point de la grille.

    Mon problème est comment simuler les volatilités de départ sans qu'il y ait une redondance en exécutant le programme une autre fois?

    J'espère que j'ai bien expliqué mon problème et que c'est pas trop long.

    Merci François de m'avoir répondu.

    Moi c'est Anissa.

    A bientôt

Sur le même thème :

Discussions similaires

  1. Comment dessiner un graphe avec trois axes en C++ Builder ?
    Par Hoopsy dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 16/06/2007, 18h14
  2. Comment intégrer des données sous Excel dans un StringGrid sous C++ Builder ?
    Par Hoopsy dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 29/05/2007, 12h56
  3. Comment programmer les puissances dans C++ Builder ?
    Par Hoopsy dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 15/05/2007, 20h14
  4. Comment utiliser des fonctions dans C++ Builder ?
    Par Hoopsy dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 09/05/2007, 08h43
  5. En images : des lacs de méthane sur Titan bien réels !
    Par RSSBot dans le forum Commentez les actus, dossiers et définitions
    Réponses: 1
    Dernier message: 05/01/2007, 12h37
Découvrez nos comparatifs produits sur l'informatique et les technologies.