Enrere Mòdul 4
Fonaments de Programació. Llenguatge C/C++---
Pràctica  Resum teòric Exercicis
Pràctica d'ampliació Annex: la depuració

 
Càlcul del número p amb llançament de dards

En aquesta pràctica farem servir els nombres aleatoris per simular el llançament de dards en una diana. Comptant el nombre d'encerts serà una forma d'estimar el número p. Aquesta tècnica anomenada d'acceptació-rebuig és la forma més simple d'una important sèrie de tècniques de simulació anomenades de Montecarlo.

 

Desenvolupament de la pràctica

Imaginem una diana de forma circular i de radi 1 inscrita en un quadrat de costat 2 i amb centre el (0,0):

Imaginem que llancem dards. Tenim tan mala punteria que només podem assegurar que els dards impactaran dintre del quadrat, però uns a dintre del cercle i uns altres a fora. Si la distribució de dards en el quadrat es fa de forma uniforme, la proporció de dards que fan diana respecte el total de dards que s'han llançat és igual al quocient entre les àrees del cercle i el quadrat, és a dir, p/4. Evidentment, per trobar un valor pròxim a aquest número és necessari que el nombre de dards sigui molt elevat. 

Farem un programa que simuli el llançament de dards en aquest quadrat i comptarem els que queden a dintre i a fora del cercle per tal de determinar el valor de p.

Definiu un projecte nou anomenat m4p07 i afegiu-li un arxiu de font C/C++ anomenat m4p07.cpp. Escriviu el següent codi:

/* m4p07.cpp: càlcul del número PI amb la simulació del     
              llançament de dards */

#include<stdio.h>
#include<stdlib.h>

void main(){
    int ct,compt=0;
    int n;
    double x,y;

    printf("Introduïu el nombre de dards\n");

    scanf("%d",&n);
    for(ct=0;ct<n;ct++){
        x=double(rand())/16384-1;
        y=double(rand())/16384-1;
        if (x*x+y*y<1) compt++;
    }

    printf("La freqüència de dianes és %.6lf\n",

        double(compt)/n);
    printf("L'aproximació de PI és %.6lf\n",

        double(compt*4)/n);
}

Explicació del programa

L'elecció d'un punt a l'atzar del quadrat es fa amb les sentències:

        x=double(rand())/16384-1;
        y=double(rand())/16384-1;

que el que fan és generar un parell de nombres reals  entre -1 i 1. 

La comprovació de si el punt generat es troba a dintre o a fora del cercle es fa amb la sentència:

       if (x*x+y*y<1) compt++;

El punt (x,y) es trobarà a dintre del cercle si es compleix que x2+y2<1. Si es compleix això, s'incrementa en 1 el comptador de dianes, que és la variable compt.

Finalment, el valor aproximat de p es trobarà multiplicant per 4 la freqüència de dianes, és a dir:

double(compt*4)/n.

la conversió a double és necessària per evitar que la divisió sigui una divisió entera.