Strumenti Utente

Strumenti Sito


fisica:informatica:201617:esercitazione3rand

Questa è una vecchia versione del documento!


Esercitazione numeri casuali

Per gli esercizi che seguono ricordatevi di includere gli header corretti

#include <stdlib.h>

per rand(), srand() e

#include <time.h>

per la funzione time().

Gli header corretti e le eventuali opzioni di compilazione da aggiungere per usare una funzione di libreria si trovano sempre nella sezione 3 del manuale

man 3 time

Esercizio 0: Generazione di numero casuali in C e ''RAND_MAX''

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 srand() serve a fissare il seme (seed) ovvero il valore iniziale della sequenza. E la funzione rand() che deve essere chiamata più volte e ogni volta genera il valore successivo della sequenza.

I valori generati sono valori interi all'interno dell'intervallo [0,RAND_MAX].

Stabilire il valore di RAND_MAX attraverso un opportuno programma C che la stampa a video.

Esercizio 1: Generazione di numero casuali interi in un intervallo

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

Esercizio 2: Generazione di numero casuali con seed diversi

Modificare l'esercizio 1 in modo da generare un seed diverso ad ogni esecuzione utilizzando la funzione time() come spiegato nei lucidi.

Esercizio 3: 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 4: 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.

Esercizio 5: Ma quanto siamo casuali ?

Per restringersi all'intervallo [A,B] possiamo utilizzare anche la seguente formula

A+((B-­A+1.0)*rand()/(RAND_MAX+1.0))

oltre a

A+rand()%(B-A + 1.0)

Utilizzare entrambe per generare sequenze di interi nell'intervallo [0,20], ci sono differenze nella distribuzione valori ottenuti ?

fisica/informatica/201617/esercitazione3rand.1488531020.txt.gz · Ultima modifica: 03/03/2017 alle 08:50 (8 anni fa) da Susanna Pelagatti

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki