#include <iostream>
#include <vector>
#include <cmath>
#include <random>
#include <chrono>
#include <iomanip>
int main( ) {
unsigned seed = std:: chrono :: high_resolution_clock :: now ( ) .time_since_epoch ( ) .count ( ) ;
std:: mt19937 generator( seed) ;
std:: uniform_real_distribution < double > distribution( 0.0 , 1.0 ) ;
std:: vector < int > N_values = { 1000 , 10000 , 100000 } ;
for ( int N : N_values) {
long long points_inside_circle = 0 ;
for ( int i = 0 ; i < N; ++ i) {
double x = distribution( generator) ;
double y = distribution( generator) ;
if ( ( x * x + y * y) <= 1.0 ) {
points_inside_circle++ ;
}
}
double estimated_pi = 4.0 * static_cast < double > ( points_inside_circle) / N;
double error = std:: fabs ( M_PI - estimated_pi) ;
std:: cout << "For N = " << N << ":\n " ;
std:: cout << " Estimated Pi = " << std:: fixed << std:: setprecision ( 10 ) << estimated_pi << "\n " ;
std:: cout << " Error = " << std:: setprecision ( 10 ) << error << "\n \n " ;
}
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxjaHJvbm8+CiNpbmNsdWRlIDxpb21hbmlwPgoKaW50IG1haW4oKSB7CiAgICB1bnNpZ25lZCBzZWVkID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCk7CiAgICBzdGQ6Om10MTk5MzcgZ2VuZXJhdG9yKHNlZWQpOwogICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gZGlzdHJpYnV0aW9uKDAuMCwgMS4wKTsKCiAgICBzdGQ6OnZlY3RvcjxpbnQ+IE5fdmFsdWVzID0gezEwMDAsIDEwMDAwLCAxMDAwMDB9OwoKICAgIGZvciAoaW50IE4gOiBOX3ZhbHVlcykgewogICAgICAgIGxvbmcgbG9uZyBwb2ludHNfaW5zaWRlX2NpcmNsZSA9IDA7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CiAgICAgICAgICAgIGRvdWJsZSB4ID0gZGlzdHJpYnV0aW9uKGdlbmVyYXRvcik7CiAgICAgICAgICAgIGRvdWJsZSB5ID0gZGlzdHJpYnV0aW9uKGdlbmVyYXRvcik7CiAgICAgICAgICAgIGlmICgoeCAqIHggKyB5ICogeSkgPD0gMS4wKSB7CiAgICAgICAgICAgICAgICBwb2ludHNfaW5zaWRlX2NpcmNsZSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBkb3VibGUgZXN0aW1hdGVkX3BpID0gNC4wICogc3RhdGljX2Nhc3Q8ZG91YmxlPihwb2ludHNfaW5zaWRlX2NpcmNsZSkgLyBOOwogICAgICAgIGRvdWJsZSBlcnJvciA9IHN0ZDo6ZmFicyhNX1BJIC0gZXN0aW1hdGVkX3BpKTsKCiAgICAgICAgc3RkOjpjb3V0IDw8ICJGb3IgTiA9ICIgPDwgTiA8PCAiOlxuIjsKICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgRXN0aW1hdGVkIFBpID0gIiA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDEwKSA8PCBlc3RpbWF0ZWRfcGkgPDwgIlxuIjsKICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgRXJyb3IgICAgICAgID0gIiA8PCBzdGQ6OnNldHByZWNpc2lvbigxMCkgPDwgZXJyb3IgPDwgIlxuXG4iOwogICAgfQoKICAgIHJldHVybiAwOwp9