#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
double estimatePiMonteCarlo( long long N) {
long long pointsInsideCircle = 0 ;
for ( long long i = 0 ; i < N; ++ i) {
double x = static_cast < double > ( rand ( ) ) / RAND_MAX ;
double y = static_cast < double > ( rand ( ) ) / RAND_MAX ;
if ( ( x * x + y * y) <= 1.0 ) {
pointsInsideCircle++ ;
}
}
return 4.0 * static_cast < double > ( pointsInsideCircle) / N;
}
int main( ) {
srand ( static_cast < unsigned int > ( time ( 0 ) ) ) ;
long long N_values[ ] = { 1000 , 10000 , 100000 , 1000000 , 10000000 } ;
double actualPi = 3.14159265358979323846 ;
std:: cout << "Monte Carlo Estimation of Pi:\n " ;
std:: cout << "--------------------------------\n " ;
for ( long long N : N_values) {
double piEstimate = estimatePiMonteCarlo( N) ;
double error = std:: abs ( piEstimate - actualPi) ;
std:: cout << "N = " << N << ":\n " ;
std:: cout << " Estimated Pi = " << piEstimate << "\n " ;
std:: cout << " Actual Pi = " << actualPi << "\n " ;
std:: cout << " Error = " << error << "\n \n " ;
}
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8Y21hdGg+Cgpkb3VibGUgZXN0aW1hdGVQaU1vbnRlQ2FybG8obG9uZyBsb25nIE4pIHsKICAgIGxvbmcgbG9uZyBwb2ludHNJbnNpZGVDaXJjbGUgPSAwOwoKICAgIGZvciAobG9uZyBsb25nIGkgPSAwOyBpIDwgTjsgKytpKSB7CiAgICAgICAgZG91YmxlIHggPSBzdGF0aWNfY2FzdDxkb3VibGU+KHJhbmQoKSkgLyBSQU5EX01BWDsKICAgICAgICBkb3VibGUgeSA9IHN0YXRpY19jYXN0PGRvdWJsZT4ocmFuZCgpKSAvIFJBTkRfTUFYOwoKICAgICAgICBpZiAoKHggKiB4ICsgeSAqIHkpIDw9IDEuMCkgewogICAgICAgICAgICBwb2ludHNJbnNpZGVDaXJjbGUrKzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDQuMCAqIHN0YXRpY19jYXN0PGRvdWJsZT4ocG9pbnRzSW5zaWRlQ2lyY2xlKSAvIE47Cn0KCmludCBtYWluKCkgewogICAgc3JhbmQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pih0aW1lKDApKSk7CgogICAgbG9uZyBsb25nIE5fdmFsdWVzW10gPSB7MTAwMCwgMTAwMDAsIDEwMDAwMCwgMTAwMDAwMCwgMTAwMDAwMDB9OwogICAgZG91YmxlIGFjdHVhbFBpID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjsKCiAgICBzdGQ6OmNvdXQgPDwgIk1vbnRlIENhcmxvIEVzdGltYXRpb24gb2YgUGk6XG4iOwogICAgc3RkOjpjb3V0IDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKCiAgICBmb3IgKGxvbmcgbG9uZyBOIDogTl92YWx1ZXMpIHsKICAgICAgICBkb3VibGUgcGlFc3RpbWF0ZSA9IGVzdGltYXRlUGlNb250ZUNhcmxvKE4pOwogICAgICAgIGRvdWJsZSBlcnJvciA9IHN0ZDo6YWJzKHBpRXN0aW1hdGUgLSBhY3R1YWxQaSk7CgogICAgICAgIHN0ZDo6Y291dCA8PCAiTiA9ICIgPDwgTiA8PCAiOlxuIjsKICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgRXN0aW1hdGVkIFBpID0gIiA8PCBwaUVzdGltYXRlIDw8ICJcbiI7CiAgICAgICAgc3RkOjpjb3V0IDw8ICIgIEFjdHVhbCBQaSAgICA9ICIgPDwgYWN0dWFsUGkgPDwgIlxuIjsKICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgRXJyb3IgICAgICAgID0gIiA8PCBlcnJvciA8PCAiXG5cbiI7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K