/**************************************************************** **** **** This file belongs with the course **** Introduction to Scientific Programming in C++/Fortran2003 **** copyright 2016-2023 Victor Eijkhout eijkhout@tacc.utexas.edu **** **** pi.cxx : C++20 ranges for \pi calculation **** ****************************************************************/ #include using std::cout; #include using std::vector; #include //#include // we need zip #include #ifdef RANGES_V3_ALL_HPP namespace rng = ranges; #else namespace rng = std::ranges; #endif #define N 100000 int main() { std::random_device r; std::default_random_engine generator{r()}; std::uniform_real_distribution distribution(0.,1.); vector x(N),y(N); vector x2,y2; vector d2(N); int in_circle{0}; x2 = x | rng::views::transform( [&] ( auto e ) { return distribution(generator); } ) | rng::views::transform( [] ( auto e ) { return e*e; } ) // | rng::to_vector ; y2 = y | rng::views::transform( [&] ( auto e ) { return distribution(generator); } ) | rng::views::transform( [] ( auto e ) { return e*e; } ) // | rng::to_vector ; auto d2r = d2 | rng::views::filter( [] ( auto e ) { return true; } ) ; for ( auto [xv,yv,dv] : rng::views::zip(x2,y2,d2r) ) dv = xv+yv; std::for_each( d2.begin(),d2.end(), [&in_circle] ( auto x ) { if (x<1.) ++in_circle; } ); cout << 4 * static_cast(in_circle) / N << '\n'; return 0; } #if 0 if (false) { for ( auto& xi : x ) xi = distribution(generator); for ( auto& yi : y ) yi = distribution(generator); for ( int i=0; i