Bonjour,
J'essaye d'utiliser le generateur de variables aleatoires de Boost dans mon code en utilisant le pattern adapteur, cependant j'obtiens le message d'erreur suivant:
Le contenu de deux fichiers d'ou le probleme semble venir sont ci-dessous.1>------ Build started: Project: ex12.2, Configuration: Debug Win32 ------
1>Compiling...
1>PathDependentExoticOption.cpp
1>c:\designcpp\include\boostrandom.h(33) : error C2664: 'boost::random_number_generator<UniformRandomNumberGenerator,IntType>::random_number_generator(boost::uniform_int<int> &)' : cannot convert parameter 1 from 'unsigned long' to 'boost::uniform_int<IntType> &'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1> and
1> [
1> IntType=int
1> ]
1> c:\designcpp\include\boostrandom.h(32) : while compiling class template member function 'BoostRandom<UniformRandomNumberGenerator,IntType>::BoostRandom(unsigned long,unsigned long)'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1> c:\moondragon\distancelearning\cpp\code\ex12.2\pathdependentexoticoption.cpp(82) : see reference to class template instantiation 'BoostRandom<UniformRandomNumberGenerator,IntType>' being compiled
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1>c:\designcpp\include\boostrandom.h(36) : error C2039: 'Max' : is not a member of 'boost::random_number_generator<UniformRandomNumberGenerator,IntType>'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1>c:\designcpp\include\boostrandom.h(49) : error C2039: 'GetOneRandomInteger' : is not a member of 'boost::random_number_generator<UniformRandomNumberGenerator,IntType>'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1> c:\designcpp\include\boostrandom.h(45) : while compiling class template member function 'void BoostRandom<UniformRandomNumberGenerator,IntType>::GetUniforms(MJArray &)'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1>c:\designcpp\include\boostrandom.h(67) : error C2039: 'SetSeed' : is not a member of 'boost::random_number_generator<UniformRandomNumberGenerator,IntType>'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1> c:\designcpp\include\boostrandom.h(63) : while compiling class template member function 'void BoostRandom<UniformRandomNumberGenerator,IntType>::SetSeed(unsigned long)'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1>c:\designcpp\include\boostrandom.h(74) : error C2039: 'SetSeed' : is not a member of 'boost::random_number_generator<UniformRandomNumberGenerator,IntType>'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1> c:\designcpp\include\boostrandom.h(71) : while compiling class template member function 'void BoostRandom<UniformRandomNumberGenerator,IntType>::Reset(void)'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1>c:\designcpp\include\boostrandom.h(82) : error C2039: 'SetSeed' : is not a member of 'boost::random_number_generator<UniformRandomNumberGenerator,IntType>'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1> c:\designcpp\include\boostrandom.h(78) : while compiling class template member function 'void BoostRandom<UniformRandomNumberGenerator,IntType>::ResetDimensionality(unsigned long)'
1> with
1> [
1> UniformRandomNumberGenerator=boost::uniform_int<int>,
1> IntType=long
1> ]
1>Build log was saved at "file://c:\MoonDragon\DistanceLearning\cpp\code\ex12.2\Debug\BuildLog.htm"
1>ex12.2 - 6 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
D'avance merci pour votre aide,
MoonDragon.
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 // BoostRandom.h #ifndef BOOST_RANDOM_H #define BOOST_RANDOM_H #include <Random2.h> #include <boost/random/random_number_generator.hpp> template<class UniformRandomNumberGenerator, class IntType = long> class BoostRandom : public RandomBase //The adaptor class { public: BoostRandom(unsigned long Dimensionality, unsigned long Seed=1); virtual RandomBase* clone() const; virtual void GetUniforms(MJArray& variates); virtual void Skip(unsigned long numberOfPaths); virtual void SetSeed(unsigned long Seed); virtual void Reset(); virtual void ResetDimensionality(unsigned long NewDimensionality); private: boost::random_number_generator <UniformRandomNumberGenerator, IntType> InnerGenerator; //One 'plug' Boost here! unsigned long InitialSeed; double Reciprocal; }; template<class UniformRandomNumberGenerator, class IntType> BoostRandom <UniformRandomNumberGenerator , IntType>::BoostRandom(unsigned long Dimensionality, unsigned long Seed) : RandomBase(Dimensionality), InnerGenerator(Seed), InitialSeed(Seed) { debugFlowTracer flow("BoostRandom::BoostRandom"); Reciprocal = 1/(1.0+InnerGenerator.Max()); } template<class UniformRandomNumberGenerator, class IntType> RandomBase* BoostRandom <UniformRandomNumberGenerator , IntType>::clone() const { return new BoostRandom(*this); } template<class UniformRandomNumberGenerator, class IntType> void BoostRandom <UniformRandomNumberGenerator , IntType>::GetUniforms(MJArray& variates) { debugFlowTracer flow("BoostRandom::GetUniforms"); for (unsigned long j=0; j < GetDimensionality(); j++) variates[j] = InnerGenerator.GetOneRandomInteger()*Reciprocal; } template<class UniformRandomNumberGenerator, class IntType> void BoostRandom <UniformRandomNumberGenerator , IntType>::Skip(unsigned long numberOfPaths) { debugFlowTracer flow("BoostRandom::Skip"); MJArray tmp(GetDimensionality()); for (unsigned long j=0; j < numberOfPaths; j++) GetUniforms(tmp); } template<class UniformRandomNumberGenerator, class IntType> void BoostRandom <UniformRandomNumberGenerator , IntType>::SetSeed(unsigned long Seed) { debugFlowTracer flow("BoostRandom::SetSeed"); InitialSeed = Seed; InnerGenerator.SetSeed(Seed); } template<class UniformRandomNumberGenerator, class IntType> void BoostRandom <UniformRandomNumberGenerator , IntType>::Reset() { debugFlowTracer flow("BoostRandom::Reset"); InnerGenerator.SetSeed(InitialSeed); } template<class UniformRandomNumberGenerator, class IntType> void BoostRandom <UniformRandomNumberGenerator , IntType>::ResetDimensionality(unsigned long NewDimensionality) { debugFlowTracer flow("BoostRandom::ResetDimensionality"); RandomBase::ResetDimensionality(NewDimensionality); InnerGenerator.SetSeed(InitialSeed); } #endif
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 // PathDependentExoticOption.cpp /* uses source files AntiThetic.cpp Arrays.cpp, ConvergenceTable.cpp, ExoticBSEngine.cpp ExoticEngine MCStatistics.cpp Normals.cpp Parameters.cpp, PathDependent.cpp PathDependentAsian.cpp PayOff3.cpp, PayOffBridge.cpp, Random2.cpp, */ #include<BoostRandom.h> #include<MCStatistics.h> #include<ConvergenceTable.h> #include<AntiThetic.h> #include<PathDependentAsian.h> #include<ExoticBSEngine.h> #include <FlowTracerManager.h> #include<iostream> using namespace std; int main() { double Expiry; double Strike; double Spot; double Vol; double r; double d; unsigned long NumberOfPaths; unsigned NumberOfDates; cout << "\nEnter expiry\n"; cin >> Expiry; cout << "\nStrike\n"; cin >> Strike; cout << "\nEnter spot\n"; cin >> Spot; cout << "\nEnter vol\n"; cin >> Vol; cout << "\nr\n"; cin >> r; cout << "\nd\n"; cin >> d; cout << "Number of dates\n"; cin >> NumberOfDates; cout << "\nNumber of paths\n"; cin >> NumberOfPaths; PayOffCall thePayOff(Strike); MJArray times(NumberOfDates); for (unsigned long i=0; i < NumberOfDates; i++) times[i] = (i+1.0)*Expiry/NumberOfDates; ParametersConstant VolParam(Vol); ParametersConstant rParam(r); ParametersConstant dParam(d); PathDependentAsian theOption(times, Expiry, thePayOff); StatisticsMean gatherer; ConvergenceTable gathererTwo(gatherer); class BoostRandom <boost::uniform_int<int>, long> generator(NumberOfDates); AntiThetic GenTwo(generator); ExoticBSEngine theEngine(theOption, rParam, dParam, VolParam, GenTwo, Spot); theEngine.DoSimulation(gathererTwo, NumberOfPaths); vector<vector<double> > results =gathererTwo.GetResultsSoFar(); cout <<"\nFor the Asian call price the results are \n"; { for (unsigned long i=0; i < results.size(); i++) { for (unsigned long j=0; j < results[i].size(); j++) cout << results[i][j] << " "; cout << "\n"; } } double tmp; cin >> tmp; return 0; }
Partager