Optional1 Solution
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// function prototypes
double myRand(void);
// main program start
int main(int argc, char *argv[]) {
//
int i, j;
int ir;
int nbatch = 10;
int batch_size = 100;
int nseed = 1;
unsigned long int batch_success;
double x, y, r;
double area_batch;
double area_accum, area_accum2, area;
double var, std, rel_err;
//
printf("\n ***** Program to Calulate PI by Monte Carlo Methods *****\n\n");
//
if (argc < 4) {
printf(" ***** ERROR: Not enough command line arguments! \n");
printf("\n Please enter in the following order:\n");
printf(" Random Number Seed\n");
printf(" Number of Batches\n");
printf(" Histories per Batch\n");
exit(0);
}
//
printf("Program Name is : %s\n", argv[0]);
printf("Random Number seed : %s\n", argv[1]);
printf("Number of Batches : %s\n", argv[2]);
printf("Histories per Batch: %s\n", argv[3]);
//
// Re-assign command line input
//
nseed = atoi(argv[1]);
nbatch = atoi(argv[2]);
batch_size = atoi(argv[3]);
//
// Initialize the random number generator
//
srand(nseed);
//
// Initialize the variance accumulators for x and x-squared
//
area_accum = 0.0;
area_accum2 = 0.0;
//
for (j=0; j<nbatch; j++) {
batch_success = 0;
for (i=0; i<batch_size; i++) {
x = 1.0 + 3.0 * myRand();
y = 1.0 + 1.0 * myRand();
r = sqrt(x);
if (y <= r) {
batch_success++;
}
}
area_batch = ((double) batch_success) / ((double) batch_size);
//
// Increment the variance accumulators
//
area_accum += area_batch;
area_accum2 += area_batch * area_batch;
}
//
// Normalize results
//
area = area_accum / nbatch;
//
// Calculate variance and standard deviation
//
var = (area_accum2 / nbatch) - (area * area);
var = var / (nbatch - 1.0);
std = sqrt(var);
//
// Print results
//
printf("\n *** RESULTS ***\n");
rel_err = std/area;
printf("Fractional Area: %f +/- %f (%f)\n", area, std, rel_err);
//
// Integrated area is total area of space sampled time MC fraction
// plus constant part.
//
area = area * 3.0 + 3.0;
std = area * rel_err;
printf("Integrated Area: %f +/- %f (%f)\n", area, std, std/area);
// printf("Pi : %f +/- %f (%f)\n", area*4.0, std*4.0, std/area);
//
} // end main function
//
double myRand() {
//
// Return a random number between 0 and 1
//
double randx;
randx = ((double) rand()) / (RAND_MAX + 1.0);
return randx;
}