Skip to content

Commit bf1ee8f

Browse files
Try to implement monte carlo simulation (#3)
1 parent 65cd8ac commit bf1ee8f

5 files changed

Lines changed: 49 additions & 8 deletions

File tree

src/BUILD

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ cc_library(
88
],
99
)
1010

11+
cc_library(
12+
name = "montecarloLib",
13+
srcs = [
14+
"montecarlo.cpp"
15+
],
16+
hdrs = [
17+
"montecarlo.h"
18+
],
19+
)
20+
1121
cc_binary(
1222
name = "mainProg",
1323
srcs = [
@@ -16,5 +26,6 @@ cc_binary(
1626
],
1727
deps = [
1828
":factorLib",
29+
":montecarloLib",
1930
],
2031
)

src/main.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,8 @@ int main(int argc, char** argv)
2525
cout << result << ",";
2626
}
2727
cout << endl;
28+
29+
auto monteCarloPi = MonteCarloPi();
30+
double pi = monteCarloPi.estimatePi();
31+
cout << "The estimated pi is: " << pi << endl;
2832
}

src/main.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
#include <iostream>
55
#include <stdexcept>
66
#include "factor.h"
7+
#include "montecarlo.h"
78

89
#endif

src/montecarlo.cpp

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,35 @@
11
#include "montecarlo.h"
22

33
const int NUM = 4;
4-
const int NUM_EACH_THREAD = 10000;
4+
const int NUM_EACH_THREAD = 10000000;
55

6-
double MonteCarloPi::estimatePiSingleThread()
6+
void MonteCarloPi::estimatePiSingleThread()
77
{
8-
8+
random_device rd;
9+
// mersenne_twister_engine seeded with rd()
10+
mt19937 gen(rd());
11+
uniform_int_distribution<> distrib(0.0, 1.0);
12+
for(int i = 0; i < NUM_EACH_THREAD; i++)
13+
{
14+
double x = distrib(gen);
15+
double y = distrib(gen);
16+
if (x*x + y*y <= 1.0)
17+
insideCircle++;
18+
}
919
}
1020

11-
void MonteCarloPi::estimatePi()
21+
double MonteCarloPi::estimatePi()
1222
{
13-
// 4 threads, each threads do calculation 10000 times
23+
for(int i = 0; i < NUM; i++)
24+
{
25+
threads.emplace_back(&MonteCarloPi::estimatePiSingleThread, this);
26+
}
27+
28+
for(auto& t : threads)
29+
{
30+
t.join();
31+
}
32+
33+
// return pi here
34+
return (4.0 * insideCircle / (NUM * NUM_EACH_THREAD));
1435
}

src/montecarlo.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@ using namespace std;
1010
class MonteCarloPi
1111
{
1212
public:
13-
double estimatePiSingleThread();
14-
void estimatePi();
13+
MonteCarloPi& operator=(const MonteCarloPi&) = delete;
14+
15+
MonteCarloPi() = default;
16+
~MonteCarloPi() = default;
17+
18+
void estimatePiSingleThread();
19+
double estimatePi();
1520

1621
private:
1722
vector<thread> threads = {};
1823
atomic<int> insideCircle = 0;
19-
2024
};
2125

2226
#endif

0 commit comments

Comments
 (0)