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

 
Simulació del llançament de dos daus

Un dels usos més didàctics de la programació és la que ens permet entendre el concepte de probabilitat. 

Sense entrar en definicions formals, indicarem que la idea intuïtiva de probabilitat d'un esdeveniment és el límit de la freqüència relativa d'aquest esdeveniment quan el nombre de realitzacions de l'experiència és molt gran. La realització molts cops d'una experiència és una tasca molt adequada per un programa informàtic. En aquesta pràctica simularem el llançament de dos daus moltes vegades i comprovarem les probabilitats de tots els resultats possibles comparant-les amb les freqüències relatives que s'obtindrà.

 

Desenvolupament de la pràctica 

Creeu un nou arxiu font C anomenat m4p06.c. i escriviu el següent codi:

//m4p06.c - Simulació de dos daus -
 

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

int dau(void);

int main(){
   int n=100000; //nombre de simulacions
   int ct;
   int freq[13]={0}; //acumularà  les freqüencies
   int temp;

   system("clear");

   srand( (unsigned)time( NULL ) );

   for(ct=0;ct<n;ct++){
      temp=dau()+dau();
      freq[temp]++;
   }
 

   for(ct=2;ct<=12;ct++){
      printf("punt. %d, %d vegades, freq relativa: %.4f\n",     ct,freq[ct],freq[ct]*1.0/n) );
   }
return 0;
}

int dau(){
    return rand()%13+1;
}

 

 

Captura de l'execució del programa.

 

 

Explicació del programa

Per tal de generar un nombre psudoaleatori enter comprès entre 1 i 6 s'ha de fer servir l'expressió:

rand()*6 /32768+1

Aquesta expressió s'ha ficat dintre d'una funció anomenada dau(). D'aquesta forma fem més fàcil la comprensió del codi. La funció dau() és una funció sense arguments que torna un nombre enter pseudoaleatori comprès entre 1 i 6.

La línia:

 temp=dau()+dau();

simula el llançament de dos daus i guarda la seva suma en la variable temp. A continuació es suma 1 a la variable freq[temp]. Ja ha sortit en pràctiques anteriors variables indexades com aquesta, en el mòdul 6 es tractarà de forma més extensa el tema de les variables indexades o vectors. 

L'algorisme intern que utilitza la funció rand() fa servir una llavor o valor inicial per iniciar la seqüència de nombres aleatoris. Per assegurar-nos que cada vegada que s'executi el programa la seqüència serà diferent es fa servir la següent línia que assigna com a valor inicial el nombre enter tornat per la funció time(),  que correspon a l'hora en segons del rellotge intern de l'ordinador, com que les diferents execucions del programa es fan en moments diferents, aquest valor inicial serà diferent. La funció srand() és la que assigna aquest valor inicial.

srand( (unsigned)time( NULL ) );

Per fer la comprovació que la simulació del llançament de dos daus correspon al que s'espera, el programa mostra les freqüències absolutes i relatives d'aquest experiment. Es pot comprovar que en el cas en què n sigui molt gran, les freqüències relatives corresponen a les probabilitats teòriques.