Calculate Pi using Monte CarloHamiltonian Monte Carlo in ScalaMonte Carlo pi calculationPi by Monte-CarloPoker Odds Calculation with Monte CarloMonte Carlo Pi (MASM)Approximating π via Monte Carlo simulationApproximating Pi, Monte Carlo integrationMonte Carlo estimation of πMonte Carlo simulation to approximate the value of PIMultithreaded Monte-Carlo Integration
Find a point shared by maximum segments
What is the meaning of "You've never met a graph you didn't like?"
What is this high flying aircraft over Pennsylvania?
Air travel with refrigerated insulin
When is the exact date for EOL of Ubuntu 14.04 LTS?
What do the positive and negative (+/-) transmit and receive pins mean on Ethernet cables?
Extract substring according to regexp with sed or grep
Hot air balloons as primitive bombers
Did I make a mistake by ccing email to boss to others?
Has the laser at Magurele, Romania reached the tenth of the Sun power?
What are the consequences of changing the number of hours in a day?
How can an organ that provides biological immortality be unable to regenerate?
Is divisi notation needed for brass or woodwind in an orchestra?
Error in master's thesis, I do not know what to do
Weird lines in Microsoft Word
If the Dominion rule using their Jem'Hadar troops, why is their life expectancy so low?
Do people actually use the word "kaputt" in conversation?
Can creatures abilities target that creature itself?
Friend wants my recommendation but I don't want to give it to him
PTIJ: Which Dr. Seuss books should one obtain?
What is the purpose of using a decision tree?
Highest stage count that are used one right after the other?
Writing in a Christian voice
1 John in Luther’s Bibel
Calculate Pi using Monte Carlo
Hamiltonian Monte Carlo in ScalaMonte Carlo pi calculationPi by Monte-CarloPoker Odds Calculation with Monte CarloMonte Carlo Pi (MASM)Approximating π via Monte Carlo simulationApproximating Pi, Monte Carlo integrationMonte Carlo estimation of πMonte Carlo simulation to approximate the value of PIMultithreaded Monte-Carlo Integration
$begingroup$
#include <iostream>
#include <iomanip>
#ifdef USE_OLD_RAND
#include <stdlib.h>
inline double getRandDart() return rand() * 1.0 / RAND_MAX;
#else
#include <random>
std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(0,1);
inline double getRandDart() return distribution(generator);
#endif
// Monte Carlo Simulator to estimate the value of PI.
//
// If we have a circle with a radius of 1.
// Then the smallest square that encloses the circle as sides of length 2.
//
// Area of circle pi r^2 = pi
// Area of square 2.r.2.r = 4
//
// Ratio of overlapping area: pi/4
//
// If we throw darts randomly at a dart board (with an even distribution) and always hit the square.
// Then the ratio of darts falling into the circle should be pi/4 of the total number of darts thrown.
//
// pi/4 * countInSquare = countInCircle
//
// pi = 4 . countInCircle / countInSquare
//
// To simplify the maths.
// We will set the center point as 0,0 and only use the top right quadrant of the circle.
// We have 1/4 the size of the square and circle but the same maths still apply.
//
// A dart thrown has a random x/y value in the range 0->1 (top right quadrant).
// A dart is outside the circle if x^2 + y^2 > 1 (note 1^2 is 1)
//
int main()
long countInSquare = 0;
long countInCircle = 0;
for(long iteration = 0; iteration <= 10'000'000'000; ++iteration)
double x = getRandDart();
double y = getRandDart();
double d = (x * x) + (y * y);
countInSquare += 1;
countInCircle += (d >= 1.0) ? 0 : 1;
if (iteration % 10'000'000 == 0)
std::cout << iteration << " " << (4.0 * countInCircle / countInSquare) << "n";
std::cout << "nn" << std::setprecision(9) << (4.0 * countInCircle / countInSquare) << "n";
Output:
> ./a.out
9990000000 3.14158
10000000000 3.14158
3.14158355
c++ numerical-methods
$endgroup$
add a comment |
$begingroup$
#include <iostream>
#include <iomanip>
#ifdef USE_OLD_RAND
#include <stdlib.h>
inline double getRandDart() return rand() * 1.0 / RAND_MAX;
#else
#include <random>
std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(0,1);
inline double getRandDart() return distribution(generator);
#endif
// Monte Carlo Simulator to estimate the value of PI.
//
// If we have a circle with a radius of 1.
// Then the smallest square that encloses the circle as sides of length 2.
//
// Area of circle pi r^2 = pi
// Area of square 2.r.2.r = 4
//
// Ratio of overlapping area: pi/4
//
// If we throw darts randomly at a dart board (with an even distribution) and always hit the square.
// Then the ratio of darts falling into the circle should be pi/4 of the total number of darts thrown.
//
// pi/4 * countInSquare = countInCircle
//
// pi = 4 . countInCircle / countInSquare
//
// To simplify the maths.
// We will set the center point as 0,0 and only use the top right quadrant of the circle.
// We have 1/4 the size of the square and circle but the same maths still apply.
//
// A dart thrown has a random x/y value in the range 0->1 (top right quadrant).
// A dart is outside the circle if x^2 + y^2 > 1 (note 1^2 is 1)
//
int main()
long countInSquare = 0;
long countInCircle = 0;
for(long iteration = 0; iteration <= 10'000'000'000; ++iteration)
double x = getRandDart();
double y = getRandDart();
double d = (x * x) + (y * y);
countInSquare += 1;
countInCircle += (d >= 1.0) ? 0 : 1;
if (iteration % 10'000'000 == 0)
std::cout << iteration << " " << (4.0 * countInCircle / countInSquare) << "n";
std::cout << "nn" << std::setprecision(9) << (4.0 * countInCircle / countInSquare) << "n";
Output:
> ./a.out
9990000000 3.14158
10000000000 3.14158
3.14158355
c++ numerical-methods
$endgroup$
$begingroup$
@Juho The question is: Please review the code. Any comments about the code would be useful.
$endgroup$
– Martin York
1 hour ago
$begingroup$
Your comment says that xx+yy==1 is not outside the circle (hence it is inside), but your code considers it outside. Which way is the correct interpretation?
$endgroup$
– 1201ProgramAlarm
1 hour ago
$begingroup$
@1201ProgramAlarm: Good catch. Stupid comments; why don't they compile so we can check the code matches the comments.
$endgroup$
– Martin York
1 hour ago
$begingroup$
There are languages where that's kind of true (but also means that you can get syntax errors with your comments)
$endgroup$
– Foon
45 mins ago
add a comment |
$begingroup$
#include <iostream>
#include <iomanip>
#ifdef USE_OLD_RAND
#include <stdlib.h>
inline double getRandDart() return rand() * 1.0 / RAND_MAX;
#else
#include <random>
std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(0,1);
inline double getRandDart() return distribution(generator);
#endif
// Monte Carlo Simulator to estimate the value of PI.
//
// If we have a circle with a radius of 1.
// Then the smallest square that encloses the circle as sides of length 2.
//
// Area of circle pi r^2 = pi
// Area of square 2.r.2.r = 4
//
// Ratio of overlapping area: pi/4
//
// If we throw darts randomly at a dart board (with an even distribution) and always hit the square.
// Then the ratio of darts falling into the circle should be pi/4 of the total number of darts thrown.
//
// pi/4 * countInSquare = countInCircle
//
// pi = 4 . countInCircle / countInSquare
//
// To simplify the maths.
// We will set the center point as 0,0 and only use the top right quadrant of the circle.
// We have 1/4 the size of the square and circle but the same maths still apply.
//
// A dart thrown has a random x/y value in the range 0->1 (top right quadrant).
// A dart is outside the circle if x^2 + y^2 > 1 (note 1^2 is 1)
//
int main()
long countInSquare = 0;
long countInCircle = 0;
for(long iteration = 0; iteration <= 10'000'000'000; ++iteration)
double x = getRandDart();
double y = getRandDart();
double d = (x * x) + (y * y);
countInSquare += 1;
countInCircle += (d >= 1.0) ? 0 : 1;
if (iteration % 10'000'000 == 0)
std::cout << iteration << " " << (4.0 * countInCircle / countInSquare) << "n";
std::cout << "nn" << std::setprecision(9) << (4.0 * countInCircle / countInSquare) << "n";
Output:
> ./a.out
9990000000 3.14158
10000000000 3.14158
3.14158355
c++ numerical-methods
$endgroup$
#include <iostream>
#include <iomanip>
#ifdef USE_OLD_RAND
#include <stdlib.h>
inline double getRandDart() return rand() * 1.0 / RAND_MAX;
#else
#include <random>
std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(0,1);
inline double getRandDart() return distribution(generator);
#endif
// Monte Carlo Simulator to estimate the value of PI.
//
// If we have a circle with a radius of 1.
// Then the smallest square that encloses the circle as sides of length 2.
//
// Area of circle pi r^2 = pi
// Area of square 2.r.2.r = 4
//
// Ratio of overlapping area: pi/4
//
// If we throw darts randomly at a dart board (with an even distribution) and always hit the square.
// Then the ratio of darts falling into the circle should be pi/4 of the total number of darts thrown.
//
// pi/4 * countInSquare = countInCircle
//
// pi = 4 . countInCircle / countInSquare
//
// To simplify the maths.
// We will set the center point as 0,0 and only use the top right quadrant of the circle.
// We have 1/4 the size of the square and circle but the same maths still apply.
//
// A dart thrown has a random x/y value in the range 0->1 (top right quadrant).
// A dart is outside the circle if x^2 + y^2 > 1 (note 1^2 is 1)
//
int main()
long countInSquare = 0;
long countInCircle = 0;
for(long iteration = 0; iteration <= 10'000'000'000; ++iteration)
double x = getRandDart();
double y = getRandDart();
double d = (x * x) + (y * y);
countInSquare += 1;
countInCircle += (d >= 1.0) ? 0 : 1;
if (iteration % 10'000'000 == 0)
std::cout << iteration << " " << (4.0 * countInCircle / countInSquare) << "n";
std::cout << "nn" << std::setprecision(9) << (4.0 * countInCircle / countInSquare) << "n";
Output:
> ./a.out
9990000000 3.14158
10000000000 3.14158
3.14158355
c++ numerical-methods
c++ numerical-methods
edited 1 hour ago
200_success
130k17154419
130k17154419
asked 1 hour ago
Martin YorkMartin York
73.7k488270
73.7k488270
$begingroup$
@Juho The question is: Please review the code. Any comments about the code would be useful.
$endgroup$
– Martin York
1 hour ago
$begingroup$
Your comment says that xx+yy==1 is not outside the circle (hence it is inside), but your code considers it outside. Which way is the correct interpretation?
$endgroup$
– 1201ProgramAlarm
1 hour ago
$begingroup$
@1201ProgramAlarm: Good catch. Stupid comments; why don't they compile so we can check the code matches the comments.
$endgroup$
– Martin York
1 hour ago
$begingroup$
There are languages where that's kind of true (but also means that you can get syntax errors with your comments)
$endgroup$
– Foon
45 mins ago
add a comment |
$begingroup$
@Juho The question is: Please review the code. Any comments about the code would be useful.
$endgroup$
– Martin York
1 hour ago
$begingroup$
Your comment says that xx+yy==1 is not outside the circle (hence it is inside), but your code considers it outside. Which way is the correct interpretation?
$endgroup$
– 1201ProgramAlarm
1 hour ago
$begingroup$
@1201ProgramAlarm: Good catch. Stupid comments; why don't they compile so we can check the code matches the comments.
$endgroup$
– Martin York
1 hour ago
$begingroup$
There are languages where that's kind of true (but also means that you can get syntax errors with your comments)
$endgroup$
– Foon
45 mins ago
$begingroup$
@Juho The question is: Please review the code. Any comments about the code would be useful.
$endgroup$
– Martin York
1 hour ago
$begingroup$
@Juho The question is: Please review the code. Any comments about the code would be useful.
$endgroup$
– Martin York
1 hour ago
$begingroup$
Your comment says that xx+yy==1 is not outside the circle (hence it is inside), but your code considers it outside. Which way is the correct interpretation?
$endgroup$
– 1201ProgramAlarm
1 hour ago
$begingroup$
Your comment says that xx+yy==1 is not outside the circle (hence it is inside), but your code considers it outside. Which way is the correct interpretation?
$endgroup$
– 1201ProgramAlarm
1 hour ago
$begingroup$
@1201ProgramAlarm: Good catch. Stupid comments; why don't they compile so we can check the code matches the comments.
$endgroup$
– Martin York
1 hour ago
$begingroup$
@1201ProgramAlarm: Good catch. Stupid comments; why don't they compile so we can check the code matches the comments.
$endgroup$
– Martin York
1 hour ago
$begingroup$
There are languages where that's kind of true (but also means that you can get syntax errors with your comments)
$endgroup$
– Foon
45 mins ago
$begingroup$
There are languages where that's kind of true (but also means that you can get syntax errors with your comments)
$endgroup$
– Foon
45 mins ago
add a comment |
1 Answer
1
active
oldest
votes
$begingroup$
One could consider at least the following points:
Instead of including
<stdlib.h>, I'd include<cstdlib>.In
getRandDart(), it might in this case be more readable to dostatic_cast<double>(rand()) / RAND_MAX;instead of multiplying by1.0.In the for loop, all of
x,yanddcan be const, so I'd make them const. This has the potential to protect the programmer from unintended mistakes, and can sometimes allow the compiler to optimize better.When you increment by one (in
countInSquare += 1;), it makes more sense to use the++operator, i.e., to just write++countInSquare. This is more idiomatic and protects us from unintended mistakes: ++ conveys the meaning of increment (by one), whereas with+=we might accidentally write+= 2;and that would be perfectly valid (but not what we wanted).Regardless of the above point, notice that during the for-loop, it holds that
iteration == countInSquare. So strictly speaking, the variablecountInSquareis unnecessary and could be replaced by justiterationwhen needed.You could consider making the number of iterations and the second operand of the
%operand constants to allow for easier modification and perhaps to slightly improve readability.Instead of typing
(4.0 * countInCircle / countInSquare)twice, we could make a function that takes the two variables as parameters. This would allow us to save some typing, and again to protect us from unintended mistakes.
$endgroup$
$begingroup$
Thanks. I like all those points.
$endgroup$
– Martin York
1 hour ago
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
return StackExchange.using("mathjaxEditing", function ()
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
);
);
, "mathjax-editing");
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "196"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215784%2fcalculate-pi-using-monte-carlo%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
One could consider at least the following points:
Instead of including
<stdlib.h>, I'd include<cstdlib>.In
getRandDart(), it might in this case be more readable to dostatic_cast<double>(rand()) / RAND_MAX;instead of multiplying by1.0.In the for loop, all of
x,yanddcan be const, so I'd make them const. This has the potential to protect the programmer from unintended mistakes, and can sometimes allow the compiler to optimize better.When you increment by one (in
countInSquare += 1;), it makes more sense to use the++operator, i.e., to just write++countInSquare. This is more idiomatic and protects us from unintended mistakes: ++ conveys the meaning of increment (by one), whereas with+=we might accidentally write+= 2;and that would be perfectly valid (but not what we wanted).Regardless of the above point, notice that during the for-loop, it holds that
iteration == countInSquare. So strictly speaking, the variablecountInSquareis unnecessary and could be replaced by justiterationwhen needed.You could consider making the number of iterations and the second operand of the
%operand constants to allow for easier modification and perhaps to slightly improve readability.Instead of typing
(4.0 * countInCircle / countInSquare)twice, we could make a function that takes the two variables as parameters. This would allow us to save some typing, and again to protect us from unintended mistakes.
$endgroup$
$begingroup$
Thanks. I like all those points.
$endgroup$
– Martin York
1 hour ago
add a comment |
$begingroup$
One could consider at least the following points:
Instead of including
<stdlib.h>, I'd include<cstdlib>.In
getRandDart(), it might in this case be more readable to dostatic_cast<double>(rand()) / RAND_MAX;instead of multiplying by1.0.In the for loop, all of
x,yanddcan be const, so I'd make them const. This has the potential to protect the programmer from unintended mistakes, and can sometimes allow the compiler to optimize better.When you increment by one (in
countInSquare += 1;), it makes more sense to use the++operator, i.e., to just write++countInSquare. This is more idiomatic and protects us from unintended mistakes: ++ conveys the meaning of increment (by one), whereas with+=we might accidentally write+= 2;and that would be perfectly valid (but not what we wanted).Regardless of the above point, notice that during the for-loop, it holds that
iteration == countInSquare. So strictly speaking, the variablecountInSquareis unnecessary and could be replaced by justiterationwhen needed.You could consider making the number of iterations and the second operand of the
%operand constants to allow for easier modification and perhaps to slightly improve readability.Instead of typing
(4.0 * countInCircle / countInSquare)twice, we could make a function that takes the two variables as parameters. This would allow us to save some typing, and again to protect us from unintended mistakes.
$endgroup$
$begingroup$
Thanks. I like all those points.
$endgroup$
– Martin York
1 hour ago
add a comment |
$begingroup$
One could consider at least the following points:
Instead of including
<stdlib.h>, I'd include<cstdlib>.In
getRandDart(), it might in this case be more readable to dostatic_cast<double>(rand()) / RAND_MAX;instead of multiplying by1.0.In the for loop, all of
x,yanddcan be const, so I'd make them const. This has the potential to protect the programmer from unintended mistakes, and can sometimes allow the compiler to optimize better.When you increment by one (in
countInSquare += 1;), it makes more sense to use the++operator, i.e., to just write++countInSquare. This is more idiomatic and protects us from unintended mistakes: ++ conveys the meaning of increment (by one), whereas with+=we might accidentally write+= 2;and that would be perfectly valid (but not what we wanted).Regardless of the above point, notice that during the for-loop, it holds that
iteration == countInSquare. So strictly speaking, the variablecountInSquareis unnecessary and could be replaced by justiterationwhen needed.You could consider making the number of iterations and the second operand of the
%operand constants to allow for easier modification and perhaps to slightly improve readability.Instead of typing
(4.0 * countInCircle / countInSquare)twice, we could make a function that takes the two variables as parameters. This would allow us to save some typing, and again to protect us from unintended mistakes.
$endgroup$
One could consider at least the following points:
Instead of including
<stdlib.h>, I'd include<cstdlib>.In
getRandDart(), it might in this case be more readable to dostatic_cast<double>(rand()) / RAND_MAX;instead of multiplying by1.0.In the for loop, all of
x,yanddcan be const, so I'd make them const. This has the potential to protect the programmer from unintended mistakes, and can sometimes allow the compiler to optimize better.When you increment by one (in
countInSquare += 1;), it makes more sense to use the++operator, i.e., to just write++countInSquare. This is more idiomatic and protects us from unintended mistakes: ++ conveys the meaning of increment (by one), whereas with+=we might accidentally write+= 2;and that would be perfectly valid (but not what we wanted).Regardless of the above point, notice that during the for-loop, it holds that
iteration == countInSquare. So strictly speaking, the variablecountInSquareis unnecessary and could be replaced by justiterationwhen needed.You could consider making the number of iterations and the second operand of the
%operand constants to allow for easier modification and perhaps to slightly improve readability.Instead of typing
(4.0 * countInCircle / countInSquare)twice, we could make a function that takes the two variables as parameters. This would allow us to save some typing, and again to protect us from unintended mistakes.
edited 1 hour ago
answered 1 hour ago
JuhoJuho
1,201410
1,201410
$begingroup$
Thanks. I like all those points.
$endgroup$
– Martin York
1 hour ago
add a comment |
$begingroup$
Thanks. I like all those points.
$endgroup$
– Martin York
1 hour ago
$begingroup$
Thanks. I like all those points.
$endgroup$
– Martin York
1 hour ago
$begingroup$
Thanks. I like all those points.
$endgroup$
– Martin York
1 hour ago
add a comment |
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215784%2fcalculate-pi-using-monte-carlo%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
@Juho The question is: Please review the code. Any comments about the code would be useful.
$endgroup$
– Martin York
1 hour ago
$begingroup$
Your comment says that xx+yy==1 is not outside the circle (hence it is inside), but your code considers it outside. Which way is the correct interpretation?
$endgroup$
– 1201ProgramAlarm
1 hour ago
$begingroup$
@1201ProgramAlarm: Good catch. Stupid comments; why don't they compile so we can check the code matches the comments.
$endgroup$
– Martin York
1 hour ago
$begingroup$
There are languages where that's kind of true (but also means that you can get syntax errors with your comments)
$endgroup$
– Foon
45 mins ago