From 65cd8acbec045bdd618540a1337bbf8be18563c7 Mon Sep 17 00:00:00 2001 From: raphaelrevivor Date: Tue, 30 Sep 2025 18:17:09 +0200 Subject: [PATCH 1/4] basic class structure for monte carlo simulation --- src/montecarlo.cpp | 14 ++++++++++++++ src/montecarlo.h | 22 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/montecarlo.cpp b/src/montecarlo.cpp index e69de29..a1097cd 100644 --- a/src/montecarlo.cpp +++ b/src/montecarlo.cpp @@ -0,0 +1,14 @@ +#include "montecarlo.h" + +const int NUM = 4; +const int NUM_EACH_THREAD = 10000; + +double MonteCarloPi::estimatePiSingleThread() +{ + +} + +void MonteCarloPi::estimatePi() +{ + // 4 threads, each threads do calculation 10000 times +} \ No newline at end of file diff --git a/src/montecarlo.h b/src/montecarlo.h index e69de29..17c8e3b 100644 --- a/src/montecarlo.h +++ b/src/montecarlo.h @@ -0,0 +1,22 @@ +#ifndef MONTE_H +#define MONTE_H + +#include +#include +#include + +using namespace std; + +class MonteCarloPi +{ +public: + double estimatePiSingleThread(); + void estimatePi(); + +private: + vector threads = {}; + atomic insideCircle = 0; + +}; + +#endif \ No newline at end of file From bf1ee8f35f2814e45f7fcb7004e0961374f33c87 Mon Sep 17 00:00:00 2001 From: RaphaelRevivor Date: Tue, 30 Sep 2025 19:32:41 +0200 Subject: [PATCH 2/4] Try to implement monte carlo simulation (#3) --- src/BUILD | 11 +++++++++++ src/main.cpp | 4 ++++ src/main.h | 1 + src/montecarlo.cpp | 31 ++++++++++++++++++++++++++----- src/montecarlo.h | 10 +++++++--- 5 files changed, 49 insertions(+), 8 deletions(-) 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 a1097cd..62bcd52 100644 --- a/src/montecarlo.cpp +++ b/src/montecarlo.cpp @@ -1,14 +1,35 @@ #include "montecarlo.h" const int NUM = 4; -const int NUM_EACH_THREAD = 10000; +const int NUM_EACH_THREAD = 10000000; -double MonteCarloPi::estimatePiSingleThread() +void MonteCarloPi::estimatePiSingleThread() { - + random_device rd; + // mersenne_twister_engine seeded with rd() + mt19937 gen(rd()); + uniform_int_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) + insideCircle++; + } } -void MonteCarloPi::estimatePi() +double MonteCarloPi::estimatePi() { - // 4 threads, each threads do calculation 10000 times + for(int i = 0; i < NUM; i++) + { + threads.emplace_back(&MonteCarloPi::estimatePiSingleThread, this); + } + + for(auto& t : threads) + { + t.join(); + } + + // return pi here + return (4.0 * insideCircle / (NUM * NUM_EACH_THREAD)); } \ No newline at end of file diff --git a/src/montecarlo.h b/src/montecarlo.h index 17c8e3b..b35b032 100644 --- a/src/montecarlo.h +++ b/src/montecarlo.h @@ -10,13 +10,17 @@ using namespace std; class MonteCarloPi { public: - double estimatePiSingleThread(); - void estimatePi(); + MonteCarloPi& operator=(const MonteCarloPi&) = delete; + + MonteCarloPi() = default; + ~MonteCarloPi() = default; + + void estimatePiSingleThread(); + double estimatePi(); private: vector threads = {}; atomic insideCircle = 0; - }; #endif \ No newline at end of file From 2e949bc57fe31a39a56aa97c7cc870f7117d938d Mon Sep 17 00:00:00 2001 From: RaphaelRevivor Date: Tue, 30 Sep 2025 19:44:40 +0200 Subject: [PATCH 3/4] Fix a bug in monte carlo simulation (#3) --- src/montecarlo.cpp | 7 +++++-- src/montecarlo.h | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/montecarlo.cpp b/src/montecarlo.cpp index 62bcd52..db6122c 100644 --- a/src/montecarlo.cpp +++ b/src/montecarlo.cpp @@ -1,5 +1,7 @@ #include "montecarlo.h" +using namespace std; + const int NUM = 4; const int NUM_EACH_THREAD = 10000000; @@ -8,7 +10,7 @@ void MonteCarloPi::estimatePiSingleThread() random_device rd; // mersenne_twister_engine seeded with rd() mt19937 gen(rd()); - uniform_int_distribution<> distrib(0.0, 1.0); + uniform_real_distribution distrib(0.0, 1.0); for(int i = 0; i < NUM_EACH_THREAD; i++) { double x = distrib(gen); @@ -31,5 +33,6 @@ double MonteCarloPi::estimatePi() } // return pi here - return (4.0 * insideCircle / (NUM * NUM_EACH_THREAD)); + cout << "insideCircle is: " << insideCircle << endl; + return (4.0 * static_cast(insideCircle) / (NUM * NUM_EACH_THREAD)); } \ No newline at end of file diff --git a/src/montecarlo.h b/src/montecarlo.h index b35b032..ddc5598 100644 --- a/src/montecarlo.h +++ b/src/montecarlo.h @@ -1,6 +1,7 @@ #ifndef MONTE_H #define MONTE_H +#include #include #include #include From da7d25f364badc604144df05cd77094bf3c8bea9 Mon Sep 17 00:00:00 2001 From: RaphaelRevivor Date: Tue, 30 Sep 2025 21:27:54 +0200 Subject: [PATCH 4/4] Optimize thread operations (#3) --- src/montecarlo.cpp | 16 ++++++++++------ src/montecarlo.h | 7 ++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/montecarlo.cpp b/src/montecarlo.cpp index db6122c..6b796dd 100644 --- a/src/montecarlo.cpp +++ b/src/montecarlo.cpp @@ -2,10 +2,15 @@ using namespace std; -const int NUM = 4; +const int NUM = 8; const int NUM_EACH_THREAD = 10000000; -void MonteCarloPi::estimatePiSingleThread() +MonteCarloPi::MonteCarloPi() +{ + inCircleVec.resize(NUM, 0); +} + +void MonteCarloPi::estimatePiSingleThread(int threadId) { random_device rd; // mersenne_twister_engine seeded with rd() @@ -16,7 +21,7 @@ void MonteCarloPi::estimatePiSingleThread() double x = distrib(gen); double y = distrib(gen); if (x*x + y*y <= 1.0) - insideCircle++; + inCircleVec[threadId]++; } } @@ -24,7 +29,7 @@ double MonteCarloPi::estimatePi() { for(int i = 0; i < NUM; i++) { - threads.emplace_back(&MonteCarloPi::estimatePiSingleThread, this); + threads.emplace_back(&MonteCarloPi::estimatePiSingleThread, this, i); } for(auto& t : threads) @@ -33,6 +38,5 @@ double MonteCarloPi::estimatePi() } // return pi here - cout << "insideCircle is: " << insideCircle << endl; - return (4.0 * static_cast(insideCircle) / (NUM * NUM_EACH_THREAD)); + 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 ddc5598..9e7743e 100644 --- a/src/montecarlo.h +++ b/src/montecarlo.h @@ -5,6 +5,7 @@ #include #include #include +#include using namespace std; @@ -13,15 +14,15 @@ class MonteCarloPi public: MonteCarloPi& operator=(const MonteCarloPi&) = delete; - MonteCarloPi() = default; + MonteCarloPi(); ~MonteCarloPi() = default; - void estimatePiSingleThread(); + void estimatePiSingleThread(int threadId); double estimatePi(); private: vector threads = {}; - atomic insideCircle = 0; + vector inCircleVec = {}; }; #endif \ No newline at end of file