Suppose we toss darts randomly at a square dartboard, whose bullseye is at the o
ID: 3594635 • Letter: S
Question
Suppose we toss darts randomly at a square dartboard, whose bullseye is at the
origin, and whose sides are 2 feet in length. Suppose also that there’s a circle
inscribed in the square dartboard. The radius of the circle is 1 foot, and it’s area
is square feet. If the points that are hit by the darts are uniformly distributed
(and we always hit the square), then the number of darts that hit inside the circle
should approximately satisfy the equation
number in circle
total number of tosses
D
4
,
since the ratio of the area of the circle to the area of the square is =4.
We can use this formula to estimate the value of with a random number
generator:
number in circle = 0;
for (toss = 0; toss < number of tosses; toss++) f
x = random double between -1 and 1;
y = random double between -1 and 1;
distance squared = x*x + y*y;
if (distance squared <= 1) number in circle++;
}
pi estimate = 4*number in circle/((double) number of tosses);
This is called a “Monte Carlo” method, since it uses randomness (the dart tosses).
Write an OpenMP program that uses a Monte Carlo method to estimate .
Read in the total number of tosses before forking any threads. Use a reduction
clause to find the total number of darts hitting inside the circle. Print the result
after joining all the threads. You may want to use long long ints for the number
of hits in the circle and the number of tosses, since both may have to be
very large to get a reasonable estimate of .
Explanation / Answer
sscanf(argv[1],"%f,NN);
N = lround(NN);
MPI_barier(MPI_COMM_WORLD);
sTime=MPI_Wtime();
numberOfHits = 0;
srand((unsigned)(time(0)));
int IN = N/np;
for(i=0;i<IN;i++)
{
x=((double)rand())/((double)RAND_MAX);
y=((double)rand())/((double)RAND_MAX);
if(((x*x)+(y*y))<=1)numberOfHits++;
}
int hit=0;
MPI_Allreduce(&numberOfHits,&hit,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD);
double est;
est =(hit*4)//(double)N);
#include<stdio.h>
#include<stdlib.h>
#include<mpi.h>
#include<math.h>
#include<time.h>
int main(int argc,char*argv[])
{
int i,id,np,N;
double x,y,NN,eTime,sTime,pTime;
int numberOfHIts;
MPI_Comm_rank(MPI_COMM_WORLD,&id);
MPI_Comm_rank(MPI_COMM_WORLD,&np);
if(argc!=2)
{
if(id==0)
{
fprintf(stderr,"Enter correctc margin/n");
fflush(sytrderr);
}
MPI_Abort(MPI_COMM_WORLD,1);
}
sscanf(argv[1],"%f",&NN);
N=iround(NN);
MPI_Barrier(MPI_COMM_WORLD);
sTime = MPI_write();
numberOfHits=0;
srand((unsigned)(time(0)));
int IN =N/np;
for(i=0;i<IN;i++)
{
x=((double)rand())/((double)RAND_MAX);
y=((double)rand())/((double)RAND_MAX);
if(((x*x)+(y*y))<=1)numberOfHits++;
}
int hit=0;
MPI_Allreduce(&numberOfHits,&hit,1,MPI_INT,MPI_SUM,MPI_COMM_WORLD);
double est;
est=(hit*4)/((double)N);
if(id==0)
{
printf("Estimate of Pi:%24.16f/n",est);
}
MPI_Finalilze();
return 0;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.