A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La...

12
a.s. 2010/11

Transcript of A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La...

Page 1: A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La funzione rand() genera un numero casuale compreso tra 0.

a.s. 2010/11

Page 2: A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La funzione rand() genera un numero casuale compreso tra 0.

Una funzione è un sottoprogramma che “svolge un lavoro” e restituisce un valore

La funzione rand() genera un numero casuale compreso tra 0 e RAND_MAX

(una costante, che secondo l’ANSI C – un protocollo per gli standard di C – deve essere maggiore o uguale di 32767);

Page 3: A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La funzione rand() genera un numero casuale compreso tra 0.

#include <iostream>using namespace std;int main(){ int x,i; for (i=1;i<=10;i++) { x = rand(); cout << x << endl; } system("Pause");}

Questo programma genera 10 numeri casuali

Page 4: A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La funzione rand() genera un numero casuale compreso tra 0.

#include <iostream>using namespace std;int main(){ int x,i; for (i=1;i<=10;i++) { x = rand() % 100; cout << x << endl; } system("Pause");}

Ma se voglio invece generare numeri ad es. compresi tra 0 e 99 ?APPLICO L’OPERATORE MODULO (RESTO)CIOE’ il %

PRIMA

DOPO

Page 5: A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La funzione rand() genera un numero casuale compreso tra 0.

Per generare numeri compresi tra 0 e N-1applico il modulo di N:

X = rand() % N;

Per averli invece tra 1 e N basta sommare 1:

X = rand() % N + 1;

Page 6: A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La funzione rand() genera un numero casuale compreso tra 0.

X = rand() % 6 + 1; (genera numeri tra 0 e 5)

Sommando 1 li ottengo tra 1 e 6 (es. del lancio del dado)

0 1 2 3 4 5

+1 +1 +1 +1 +1 +1

1 2 3 4 5 6

Page 7: A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La funzione rand() genera un numero casuale compreso tra 0.

I numeri tra 20 e 30 sono 11Quindi genero un numero tra 0 e 10e sommo 20 (se è zero diventa 20, se è 10diventa 30)

0 1 2 3 4 5 6 7 8 9 10

+ 20

+ 20

+ 20

+ 20

+ 20

+ 20

+ 20

+ 20

+ 20

+ 20

+ 20

20 21 22 23 24 25 26 27 28 29 30

Page 8: A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La funzione rand() genera un numero casuale compreso tra 0.

Devo “rimescolare l’urna” da cui vengono estratti i numeri,

Con la funzione srand “che accetta come argomento un seme (del tipo

unsigned int), che “insemina” la funzione rand, in modo da indurla a generare una diversa sequenza di numeri casuali ad ogni esecuzione del programma, a patto che sia fornito ogni volta un seme diverso.Come ovviare però a questo ultimo inconveniente?Si può fornire come argomento a srand l’orario in quell’istante, letto dall’orologio interno del computer da parte della funzione time”

http://www.pierotofy.it/pages/guide_tutorials/C/Generazione_di_numeri_casuali/

PS “I wrote a program for calculating current date and time using function time(NULL). I read this function contains total seconds from 1970.01.01 till now. “

Page 9: A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La funzione rand() genera un numero casuale compreso tra 0.

srand(7);

srand(17);

Escono sequenze diverse, ma aparità di seme, esce SEMPRE LA STESSA, cioè con seme 7 esce SEMPRE 61, 22, 15, 40 …

Page 10: A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La funzione rand() genera un numero casuale compreso tra 0.

Per CAMBIARE IL SEME IN MODO CASUALE, posso usare COME SEME (seed) l’ ora di sistema, che sarà un numero diverso ad ogni esecuzione del programma, permettendo così di ottenere SEQUENZE OGNI VOLTA DIVERSE, perché cambia il seme ogni volta:

il valore più aleatorio al quale un programma può accedere è l'istante nel quale viene eseguito: da ciò deriva l'uso dell'argomento time(NULL).

“Usingsrand(time(NULL));makes use of the computer's internal clock to control the choice of the seed.  Since time is continually changing, the seed is forever changing.  Remember, if the seed number remains the same, the sequence of numbers will be repeated for each run of the program”.PS “I wrote a program for calculating current date and time using function time(NULL). I read this function contains total seconds from 1970.01.01 till now. “

Page 11: A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La funzione rand() genera un numero casuale compreso tra 0.

Una macchina produce tondini di ferro che dovrebbero avere un diametro di 20 mm.

Sono accettati anche tondini che abbiano un diametro di 5 mm in più o in meno e che vengono considerati di seconda scelta.

Gli altri vengono scartati come difettosi.  Simulare utilizzando la funzione random una

produzione di 1000 tondini con un diametro compreso tra 10 e 30 e indicare quanti sono:◦ I tondini prodotti di prima scelta;◦ Quelli di seconda scelta;◦ Quelli scartati come difettosi.

Page 12: A.s. 2010/11. Una funzione è un sottoprogramma che svolge un lavoro e restituisce un valore La funzione rand() genera un numero casuale compreso tra 0.

Scrivere un programma che svolga le seguenti operazioni: a. simula una successione di lanci di moneta (Testa o

Croce);b. continua a generare lanci di moneta fino a che la

condizione di terminazione e' verificata;c. la condizione di terminazione e' la seguente: la

sequenza generata contiene almeno 5 esiti uguali consecutivi (es: 5 volte Testa, o 5 volte Croce)

d. il programma deve restituire il numero di lanci di moneta che sono stati necessari per verificare la condizione di terminazione

(http://wwwold.iit.cnr.it/staff/paolo.santi/LabC/random.htm)