#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <sys/time.h>
#include <omp.h>

using namespace std;

int main() {

  long int N = 1000000000; // 10^9 Werte
  timeval start, end;
  double x, y;

  for (int nt = 1; nt<=16; nt++) {
    double treffer = 0;
    unsigned int seed = 0;

    gettimeofday(&start, 0);

    #pragma omp parallel num_threads(nt) private(x, y, seed) shared(N) reduction(+: treffer) 
    {
      seed = omp_get_thread_num();
      #pragma omp for 
      for (long int i=0; i<N; i++) {
        x = (double) rand_r(&seed) / (double) RAND_MAX;
        y = (double) rand_r(&seed) / (double) RAND_MAX;
        if (x*x+y*y < 1) treffer++;
      }
    }
    gettimeofday(&end, 0);
    double diff = ( (double)end.tv_sec + (double)end.tv_usec / 1000000.0 )
                - ( (double)start.tv_sec + (double)start.tv_usec / 1000000.0 ); 

    cout << nt << " threads: pi ist etwa " << setprecision(12) << setw(12) 
         << 4*(treffer/(double) N) <<  "; Rechenzeit: " 
         <<  diff << "s" << endl;
    
  }
  return 0;
}
