Fontion utilisant un générateur de nombre entier borné

Fontion utilisant un générateur de nombre entier borné - C++ - Programmation

Marsh Posté le 30-08-2006 à 13:44:32    

Bonjour,
 
Je souhaite réaliser un programme qui puisse générer aléatoirement des nombres compris entre 1 et une borne supérieure que je noterai par la variable x (par exemple x=500).
Pour celà je lui donne en entrée la borne supérieur x et il me fait n tirage compris entre 1 et 500, pour les stocker ensuite dans une matrice colonne.
J'ai réussi à écrire le code suivant mais je ne comprend pas ce ne qui marche pas. Je ne suis pas un expert en c++, donc forcement j'ai du mal à voir ce qui ne va pas.
Je vous joint mon fichier source qui contient la main:

Code :
  1. //fichier main principal
  2. #include "essai.h"
  3. #include <iostream>
  4. #include <sstream>
  5. #include <fstream>
  6. #include <iomanip>
  7. #include <string>
  8. using namespace std;
  9. int main()
  10. {
  11. ifstream fichierEntree("O:\\opgestion\\service\\OAM\\Risk Management\\VaR\\Var_Version_1.0\\Matrice rendements.txt", ios::in);
  12. //lecture de la profondeur historique commune au portefeuille
  13. int x;
  14. fichierEntree >> x;
  15. std::cout << x << std::endl;
  16. //lecture du nombre de simulation souhaitée
  17. int nbre_simul;
  18. fichierEntree >> nbre_simul;
  19. std::cout << nbre_simul << std::endl;
  20. //initialise la matrice de sortie
  21. ColumnVector sortie;
  22. sortie.ReSize(x);
  23. sortie = Simul_Histo(x,nbre_simul);
  24. std::cout << sortie(2) << std::endl;
  25. return 0;
  26. }


 
Mon fichier source qui contient les fonctions:

Code :
  1. // Il s'agit du fichier DLL principal.
  2. #include "stdafx.h"
  3. #include "HistoSim.h"
  4. int nbre_tire(int min, int max)
  5. {
  6. srand(time(Null));
  7. //renvoie d'un nombre entier naturel compris dans l'intervalle [min,max[
  8. unsigned int intervalle = max - min;
  9. int tirage = min + (rand() % intervalle);
  10. ASSERT(tirage >= min && tirage <= max);
  11. return tirage;
  12. }
  13. ReturnMatrix Simul_Histo(const int& prof_histo, const int& nbre_simul)
  14. {
  15. //créer une matrice colonne Simul_Histo
  16. ColumnVector Simul_Histo;
  17. //redimensionne la matrice Simul_Histo avec la dimension correpondante  
  18. //au nombre de titre
  19. Simul_Histo.ReSize(nbre_simul);
  20. //générateur de loie normale
  21. for (int i=1;  i<=nbre_simul; ++i)
  22.  Simul_Histo(i)= nbre_tire(1,prof_histo);
  23. }
  24. Simul_Histo.Release();
  25. return Simul_Histo;
  26. }


 
En sortie j'ai le message d'erreur suivant :
[/code]
------ Début de la régénération globale : Projet : SimulHisto, Configuration : Release Win32 ------
 
Supprimer des fichiers de sortie et des fichiers intermédiaires du projet 'SimulHisto', configuration 'Release|Win32'.
Compilation...
Stdafx.cpp
Compilation...
Submat.cpp
sort.cpp
Solution.cpp
Sl_ex.cpp
Newmatex.cpp
Newmat9.cpp
Newmat8.cpp
Newmat7.cpp
Newmat6.cpp
Newmat5.cpp
Newmat4.cpp
Newmat3.cpp
Newmat2.cpp
Newmat1.cpp
Myexcept.cpp
HistoSim.cpp
HistoSim.cpp(8) : warning C4518: 'int ' : classe de stockage ou spécificateur(s) de type inattendu(es) ; ignoré(es)
HistoSim.cpp(8) : error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'nbre_tire'
HistoSim.cpp(10) : error C2065: 'Null' : identificateur non déclaré
evalue.cpp
essai.cpp
essai.cpp(29) : error C3861: 'Simul_Histo': identificateur introuvable, même avec une recherche qui dépend de l'argument
Cholesky.cpp
Bandmat.cpp
 
Le journal de génération a été enregistré à l'emplacement "file://d:\Documents and Settings\Amor\Desktop\Simul_Histo_c++\Release\BuildLog.htm"
SimulHisto - 3 erreur(s), 1 avertissement(s)
 
 
---------------------- Terminé ----------------------
 
    Régénération globale : 0 a réussi, 1 a échoué, 0 a été ignoré
 
 
[/code]
Les autres fichiers sources que vous voyez correspondent simplement à une bibliothèque de Matrice nommé Newmat et que j'ai déjà testé auparavant et qui marche bien.
Mon problème vient de l'implémentation de la fonction nbre_titre qui génére par exemple un nombre compris entre 1 et 500, est ce quelqu'un aurait une idée la-dessus?
 
Merci de votre aide
 

Reply

Marsh Posté le 30-08-2006 à 13:44:32   

Reply

Marsh Posté le 30-08-2006 à 13:52:16    

tu peux poster histosim.h ?


---------------
Töp of the plöp
Reply

Marsh Posté le 30-08-2006 à 14:00:46    

_darkalt3_ a écrit :

tu peux poster histosim.h ?


Bien sûr

Code :
  1. // CorrelSimul.h
  2. //Specifies that the file will be included (opened) only once by the compiler in a build.  
  3. //This can reduce build times as the compiler will not open and read the file
  4. //after the first #include of the module.
  5. //#pragma once
  6. //using namespace System
  7. //namespace CorrelSimul
  8. // public __gc class Class1
  9. // {
  10.  // TODO : ajoutez ici vos méthodes pour cette classe.
  11. // };
  12. int nbre_tire(int min, int max);
  13. ReturnMatrix Simul_Histo(const int& prof_histo, const int& nbre_simul)


Voilà

Reply

Marsh Posté le 30-08-2006 à 14:08:14    

Il te manque un ";" a la ligne 19 après Simul_Histo()

Reply

Marsh Posté le 30-08-2006 à 14:14:20    

_darkalt3_ a écrit :

tu peux poster histosim.h ?


Il y avait juste une virgule que j'ai oubliée à la fin de la deuxième ligne
Mille pardon pour cette erreur de débutant

Reply

Marsh Posté le 30-08-2006 à 14:18:36    

Faut bien lire les messages d'erreur :)
 
D'autre part, il te manque le triplet #ifndef / #define / #endif dans ton .h


---------------
Töp of the plöp
Reply

Marsh Posté le 30-08-2006 à 14:39:57    

_darkalt3_ a écrit :

Faut bien lire les messages d'erreur :)
 
D'autre part, il te manque le triplet #ifndef / #define / #endif dans ton .h


Oui oui ça aussi c'est corrigé, en fait je me suis trompé dans l'orthographe d'une fonction et comme j'ai pas de debugger je ne savais pas d'ou ça venait. Voilà.
D'ailleurs je tourne avec la version VisualStudio.net 2003 et que je veux utiliser le debugger pour voir ou je me suis planté dans mon code il me debugge le tout en language machine directement et je ne comprend pas pourquoi??
En tout cas merci de m'avoir souligné mes erreurs.

Reply

Marsh Posté le 30-08-2006 à 16:07:23    

iamora a écrit :

Oui oui ça aussi c'est corrigé, en fait je me suis trompé dans l'orthographe d'une fonction et comme j'ai pas de debugger je ne savais pas d'ou ça venait. Voilà.
D'ailleurs je tourne avec la version VisualStudio.net 2003 et que je veux utiliser le debugger pour voir ou je me suis planté dans mon code il me debugge le tout en language machine directement et je ne comprend pas pourquoi??
En tout cas merci de m'avoir souligné mes erreurs.


 
 
Tu compile en mode debug ou en mode release ?
En mode release ... c'est normal :)

Reply

Marsh Posté le 31-08-2006 à 09:11:18    

Une remarque: dans ta fonction nbre_tire, tu utilises un modulo pour ramener le résultat de rand() dans l'intervalle qui t'intéresse (ce qui veut dire que tu te bases uniquement sur les bits de pois faible du nombre généré pseudo aléatoirement). En général, on conseille de faire l'inverse :  
 

Citation :

Les versions de rand() et srand() de la bibliothèque C de Linux utilisent le même générateur de nombres aléatoires que random() et srandom(), ainsi les bits de poids faibles sont tout aussi imprévisibles que les bits de poids forts. Ceci n'est pas le cas avec les anciennes implémentations de rand(), où les bits de poids faibles n'étaient pas "aussi aléatoires" que ceux de poids forts.
 
Dans Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New York: Cambridge University Press, 1990 (1st ed, p. 207)), le commentaire suivant apparaît :
 
    "Si vous désirez engendrer un entier aléatoire entre 1 et 10, vous devez toujours procéder en utilisant les bits de poids forts, comme dans :
 
        j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
 
    et jamais ainsi :
 
        j=1+(rand() % 10);
 
    (car cette derniere version utilise les bits de poids faibles)."

Source : page de man de rand()


---------------
TriScale innov
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed