In this section we are going to evaluate
,
yet again, using
a Monte Carlo method. Monte Carlo methods are quite popular because
they are usually rather easy to code and to parallelize, but they can be
also inaccurate and slow.
The way we're going to employ Monte Carlo in this code is as follows. The area
of a circle is given by
,
where r is the
radius of the circle. For r = 1 we have that
.
The area of a square this circle is fitted in is
.
So
the ratio of
.
Now imagine that you throw grains of sand, at random, at the
square.
We expect that
of all grains will end up within the circle, the remaining grains landing outside.
![]() |
Within this program we are going to have worker processes throw sand grains at random at the square and check if the grains
have landed within or without the circle. Every now and then the
processes will collect the results from each other in order to improve
their estimate of
.
We are going to have one process, set aside,
whose only job will be to generate random numbers. The process will
send the numbers to the workers on request. This guarantees that
each worker is going to get different random numbers. In our
other programs we dealt with this problem by using the process rank
number to seed the random number generator differently. So this is
a new strategy.
The process that is set aside will be excluded from
the communicator, which the worker processes will use to exchange
their estimates of
with each other. So we are going to learn
on this occasion how to construct such a communicator too.
The computation goes on until the required accuracy is reached,
and this accuracy is passed through the command line, the parameter
is called
,
or until
the maximum number of sand grains has been thrown on the square.