diff --git a/src/BUILD b/src/BUILD index a8965f0..b268e1c 100644 --- a/src/BUILD +++ b/src/BUILD @@ -8,6 +8,16 @@ cc_library( ], ) +cc_library( + name = "montecarloLib", + srcs = [ + "montecarlo.cpp" + ], + hdrs = [ + "montecarlo.h" + ], +) + cc_binary( name = "mainProg", srcs = [ @@ -16,5 +26,6 @@ cc_binary( ], deps = [ ":factorLib", + ":montecarloLib", ], ) \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index f084620..22870bd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,4 +25,8 @@ int main(int argc, char** argv) cout << result << ","; } cout << endl; + + auto monteCarloPi = MonteCarloPi(); + double pi = monteCarloPi.estimatePi(); + cout << "The estimated pi is: " << pi << endl; } \ No newline at end of file diff --git a/src/main.h b/src/main.h index 8f38a45..1342c80 100644 --- a/src/main.h +++ b/src/main.h @@ -4,5 +4,6 @@ #include #include #include "factor.h" +#include "montecarlo.h" #endif \ No newline at end of file diff --git a/src/montecarlo.cpp b/src/montecarlo.cpp index e69de29..6b796dd 100644 --- a/src/montecarlo.cpp +++ b/src/montecarlo.cpp @@ -0,0 +1,42 @@ +#include "montecarlo.h" + +using namespace std; + +const int NUM = 8; +const int NUM_EACH_THREAD = 10000000; + +MonteCarloPi::MonteCarloPi() +{ + inCircleVec.resize(NUM, 0); +} + +void MonteCarloPi::estimatePiSingleThread(int threadId) +{ + random_device rd; + // mersenne_twister_engine seeded with rd() + mt19937 gen(rd()); + uniform_real_distribution distrib(0.0, 1.0); + for(int i = 0; i < NUM_EACH_THREAD; i++) + { + double x = distrib(gen); + double y = distrib(gen); + if (x*x + y*y <= 1.0) + inCircleVec[threadId]++; + } +} + +double MonteCarloPi::estimatePi() +{ + for(int i = 0; i < NUM; i++) + { + threads.emplace_back(&MonteCarloPi::estimatePiSingleThread, this, i); + } + + for(auto& t : threads) + { + t.join(); + } + + // return pi here + return (4.0 * accumulate(inCircleVec.begin(), inCircleVec.end(), 0) / (NUM * NUM_EACH_THREAD)); +} \ No newline at end of file diff --git a/src/montecarlo.h b/src/montecarlo.h index e69de29..9e7743e 100644 --- a/src/montecarlo.h +++ b/src/montecarlo.h @@ -0,0 +1,28 @@ +#ifndef MONTE_H +#define MONTE_H + +#include +#include +#include +#include +#include + +using namespace std; + +class MonteCarloPi +{ +public: + MonteCarloPi& operator=(const MonteCarloPi&) = delete; + + MonteCarloPi(); + ~MonteCarloPi() = default; + + void estimatePiSingleThread(int threadId); + double estimatePi(); + +private: + vector threads = {}; + vector inCircleVec = {}; +}; + +#endif \ No newline at end of file