Demo 5, tehtävä 5 ----------------- Allaoleva ohjelma laskee piin likiarvon Monte Carlo -menetelmällä, ts. arpomalla satunnaisia (x,y) pareja neliöstä (-1,1)*(-1,1) ja laskemalla kuinka moni niistä osuu 1-säteisen ympyrän sisään. Argumentit ovat laskettavien parien määrä ja satunnaislukugeneraattorin siemen. Esim. $ ./montecarlo 100000 12345 78719:100000 -> pi ~ 3.148760 Muuta sitä niin, että jos siemeniä on annettu enemmän, se jakaa laskun vastaavalle määrälle prosesseja, tulostaa kunkin aliprosessin tulokset erikseen ja lopuksi kaikki yhteenlaskettuna. Siis esim. ./montecarlo 1000000 123 456 789 741 käynnistäisi 4 prosessia, joista kukin laskisi 250000 kierrosta. #include #include double drandom(void) { return (double)random() / 2147483648.0; } int main(int argc, char **argv) { long inside=0; long rounds = 10000; long i; double x, y; unsigned seed = 12345; if (argc > 0) sscanf(argv[1], "%ld", &rounds); if (argc > 1) sscanf(argv[2],"%u", &seed); srandom(seed); i = rounds; while (i--) { x = drandom(); y = drandom(); if (x*x + y*y < 1) inside++; } printf("%d:%d -> pi ~ %f\n", inside, rounds, (double)inside/rounds * 4); return 0; }