Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1603 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1433695
iamora
Posté le 30-08-2006 à 13:44:32  profilanswer
 

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
 

mood
Publicité
Posté le 30-08-2006 à 13:44:32  profilanswer
 

n°1433700
_darkalt3_
Proctopathe
Posté le 30-08-2006 à 13:52:16  profilanswer
 

tu peux poster histosim.h ?


---------------
Töp of the plöp
n°1433705
iamora
Posté le 30-08-2006 à 14:00:46  profilanswer
 

_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à

n°1433712
Amonchakai
Posté le 30-08-2006 à 14:08:14  profilanswer
 

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

n°1433716
iamora
Posté le 30-08-2006 à 14:14:20  profilanswer
 

_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

n°1433719
_darkalt3_
Proctopathe
Posté le 30-08-2006 à 14:18:36  profilanswer
 

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
n°1433734
iamora
Posté le 30-08-2006 à 14:39:57  profilanswer
 

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

n°1433789
straffo
Posté le 30-08-2006 à 16:07:23  profilanswer
 

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 :)

n°1434093
franceso
Posté le 31-08-2006 à 09:11:18  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[.NET] Griser un onglet entier ?Nombre en ordre inverse
Convertir un buffer recu par socket pour afficher un entierGénérateur trames SNMP
Générateur de trames SNMPProblème avec nombre d'enregistrements dans une table
Comment éviter de tricher sur le nombre de fois qu'un lien est cliqué?[VBA] Compter le nombre de checkboxes cochées
Recuperer le nombre d'enregistrement modifier avec un UPDATEcomment securiser un site entier
Plus de sujets relatifs à : Fontion utilisant un générateur de nombre entier borné


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR