Strumenti Utente

Strumenti Sito


fisica:informatica:201516:primoanno:esercitazione3rand

Esercitazione numeri casuali

Esercizio 1: Generazione di numero casuali in C

In alcuni casi e' importante riuscire a generare casualmente dei valori all'intero di programmi C per modellare situazioni reali o per testare opportunamente i programmi scritti. In realta' il computer non riesce a generare eventi realmente “a caso” in quanto tutti i programma si basano su una determinata sequenza di azioni. Tuttavia e' possibile avere un comportamento vicino alla casualita' con le sequenze pseudocasuali, che vengono generate con un procedimento deterministico ma mantengono proprieta' statistiche simili a quelle di una vera sequenza casuale.

Inoltre le sequenze pseudocasuali possono, su richiesta, rigenerare la stessa sequenza di numeri. Questo e' molto utile ad esempio in fase di testing del codice.

La generazione di numeri pseudocasuali e' molto complessa. Tutti i linguaggi di programmazione ad alto livello mettono a disposizione delle opportune funzioni per generare una sequenza. In C, per generare una sequenza pseudocasuale si utilizzano due funzioni di stdlib.h: la funzione

void srand(unsigned int seed);

che serve a fissare il seme (seed) ovvero il valore iniziale della sequenza. E la funzione

int rand(void);

che genera i valori successivi della sequenza, ovvero un intero nell'intervallo [0,RAND_MAX] ogni volta che viene chiamata.

La srand() deve essere chiamata una sola volta per fissare il seme, successivamente la sequenza puo' essere generata con chiamate successive alla rand().

Partendo dallo stesso valore iniziale si ottiene sempre la stessa sequenza quindi fornendo lo stesso seme a srand() possiamo riprodurre piu' volte la stessa sequenza casuale quando occorre (per testing o altro).

Utilizzare le funzioni srand() e rand() per scrivere un programma C che legge due valori dallo standard input:

  • N (numero degli interi da generare) e
  • seed (seme da utilizzare)

e stampa sullo standard output N valori casuali nell'intervallo [0,2] generati con seme seed. Un esempio di funzionamento del programma e' il seguente

$./generatore
Inserisci N e seed:
3 42
Generati 3 valori interi nell'intervallo [0,2] con seed 42:
1
0
2

suggerimento: leggere attentamente il manuale di srand e rand e utilizzare l'operatore resto %

Esercizio 2: Generazione di numero casuali reali

Scrivere un programma C che legge dallo standard input un numero N di reali da generare e stampa sullo standard output una sequenza di N numeri casuali reali nell'intervallo [0,1) utilizzando le funzioni srand() e rand() introdotte nell'esercizio precedente.

Suggerimento: Utilizzare RAND_MAX e la divisione fra reali.

Esercizio 3: La macchina di Galton

La macchina di Galton (Galton Board) e' un dispositivo ideato nella seconda meta dell'Ottocento per illustrare in modo semplice il teorema del limite centrale. Qui vogliamo realizzare una versione virtuale della macchina, che utilizzi un generatore di numeri pseudocasuali. Le regole sono semplici: dato un opportuno sistema di riferimento (illustrato in Figura sotto) ed un intero n > 0 una pallina parte dall'alto nella posizione n/2+1 e si muove di n passi verso il basso, spostandosi contestualmente verso destra o verso sinistra (in modo casuale) di +0.5 o -0.5 con uguali probabilita' (pd = ps = 0.5).

n = 8
...1.2.3.4.5.6.7.8.9
=====================
0|........o........|
1|.........o.......|
2|..........o......|
3|.........o.......|
4|........o........|
5|.......o.........|
6|......o..........|
7|.....o...........|
8| | | |o| | | | | |
=====================
...1.2.3.4.5.6.7.8.9

Figura 1 La macchina di Galton per n = 8

E' facile convincersi che la posizione di arrivo nel punto piu' basso puo' assumere tutti i valori tra 1 e n+1 (non con la stessa probabilita'!).

Realizzare un programma C che letto il numero dipassi da standard input igeneri e visualizzi sullo schermo possibili percorsi della pallina. Si puo' utilizzare una grafica a piacere o quella della Figura 1.

fisica/informatica/201516/primoanno/esercitazione3rand.txt · Ultima modifica: 11/03/2016 alle 09:10 (9 anni fa) da Roberta Gori

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki