NUMERI CASUALI E SIMULAZIONE

Похожие документы
Laboratorio di Calcolo I. Applicazioni : Metodo Monte Carlo

CALCOLO NUMERICO. Prof. Di Capua Giuseppe. Appunti di Informatica - Prof. Di Capua 1

Introduzione al C. Esercitazione 6. Raffaele Nicolussi. Corso di Fondamenti di Informatica Ingegneria Clinica

Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017

Generazione di numeri casuali

Algoritmi in C++ (prima parte)

Laboratorio di Programmazione: Linguaggio C Lezione 9 del 27 novembre 2013

Programmazione I - Laboratorio

Generazione di numeri random. Distribuzioni uniformi

Simulazione dei dati

Uso delle funzioni della libreria GSL

Generatori di numeri casuali

Numeri Random. D.E.I.S. Università di Bologna DEISNet

Metodi Computazionali della Fisica Secondo Modulo: C++

- noise di conteggio ; f[m] è un numero intero che è la realizzazione di una variabile aleatoria con valor medio (valore atteso) f 0 [m].

Teoria dei Fenomeni Aleatori AA 2012/13

PROBABILITA. Distribuzione di probabilità

2.3.1 Generazione di numeri pseudocasuali con distribuzione uniforme

LA DISTRIBUZIONE NORMALE o DI GAUSS

Introduzione alla probabilità. Renato Mainetti

Il generatore di numeri casuali

Esercitazione 6. Array

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Corso di Laboratorio 2 Programmazione C++ Silvia Arcelli. 9 Novembre 2015

Il metodo Monte Carlo. Esempio di transizione al caos. Numeri (pseudo)casuali. λ 1. Analisi dati in Fisica Subnucleare

Espressione di chiamata di funzione

Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Algoritmi in C++ (seconda parte)

Metodi Computazionali. Generazione di numeri pseudocasuali

La programmazione in linguaggio C

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Esercitazione 4. Comandi iterativi for, while, do-while

Algoritmi di ordinamento: Array e ricorsione

Esercitazione 11. Liste semplici

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

1 (4) 2 (4) 3 (12) 4 (6) 5 (6)

Le funzioni, e le istruzioni di input/output

Esercizi di programmazione in C

IL PRIMO PROGRAMMA IN C

Massimo Benerecetti Tabelle Hash: gestione delle collisioni

PROBABILITÀ ELEMENTARE

PROBABILITÀ - SCHEDA N. 3 VARIABILI ALEATORIE CONTINUE E SIMULAZIONE

Sperimentazioni di Fisica I mod. A Statistica - Lezione 2

Teorema del limite centrale TCL

Perché il linguaggio C?

Modelli e Metodi per la Simulazione (MMS)

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

L'Allocazione Dinamica della Memoria nel linguaggio C

La simulazione con DERIVE Marcello Pedone LE SIMULAZIONI DEL LANCIO DI DADI CON DERIVE

Primi passi col linguaggio C

Sommario. Capitolo 1 I dati e la statistica 1. Capitolo 2 Statistica descrittiva: tabelle e rappresentazioni grafiche 25

MODELLISTICA DI IMPIANTI E SISTEMI Syllabus e Testi di Riferimento Prof. Giuseppe Iazeolla

Probabilità e numeri casuali Teoria e programmazione Pascal e C++

PROGRAMMAZIONE: ESERCITAZIONE N. 6

Distribuzioni di probabilità e principi del metodo di Montecarlo. Montecarlo

Stringhe e allocazione dinamica della memoria

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Tipi di variabili. Indici di tendenza centrale e di dispersione

Dati aggregati. Violetta Lonati

LA DISTRIBUZIONE NORMALE. La distribuzione Gaussiana. Dott.ssa Marta Di Nicola

Modulo Simulazione Parte 1. Simulazione ad Eventi Discreti: Concetti Base. Organizzazione del modulo

Транскрипт:

NUMERI CASUALI E SIMULAZIONE NUMERI CASUALI Usati in: statistica programmi di simulazione... Strumenti: - tabelle di numeri casuali - generatori hardware - generatori software

DESCRIZIONE DEL PROBLEMA Un programma che usa numeri casuali richiede un generatore software una macchina virtuale software è deterministica, quindi non può generare numeri veramente casuali È possibile ideare algoritmi per la generazione di numeri apparentemente casuali In questo caso otteniamo un generatore di numeri pseudo-casuali REQUISITI PER UN PROGRAMMA GENERATORE L'obiettivo teorico è generare serie infinite di numeri statisticamente indipendenti all'interno di un dato intervallo, ad esempio (0,1), intervallo aperto Il generatore deve essere: efficiente - ripetibile - programmi di simulazione possono doverlo attivare milioni di volte la stessa sequenza deve poter essere rigenerata a piacere Nel 1951 D.H. Lehmer ha proposto un algoritmo parametrico che, per una opportuna scelta dei parametri, ha superato numerosi test empirici di casualità Numeri casuali e simulazione 2

Generatore di Lehmer Siano dati: i) modulo: m intero, primo, grande ii) moltiplicatore: a intero, 1 < a < m iii) funzione f(z): z n+1 = a * z n mod m iv) seme: z 1 intero, 1 z 1 m-1 v) normalizzazione u n = z n / m poichè m è primo, la funzione non produce mai 0 per 1 z m-1, quindi la sequenza non collassa mai a 0 (diversamente sarebbe possibile a1 * m1 * z1 * m2 mod m1 * m2 = 0) la normalizzazione v) non influenza l'apparente casualità della sequenza la sequenza non ha, ovviamente, nulla di casuale, ma per una opportuna scelta di a ed m non è distinguibile da una vera sequenza casuale fissati a ed m, risulta fissata la lunghezza del periodo p (p<=m), tale che z p =z 1 definiamo sequenza a periodo completo una permutazione dei numeri 1,...,m-1 esistono coppie di valori a ed m che generano sequenze a periodo completo il seme influenza soltanto il punto di partenza della sequenza, ma non l'ordine i valori di u saranno 1/m, 2/m,..., (m-1)/m, con media 1/2 e σ 1/ 12 Esempio: f(z) = 6z mod 13...1,6,10,8,9,2,12,7,3,5,4,11,1... Numeri casuali e simulazione 3

UNA SOLUZIONE EFFICACE occorre trovare coppie di parametri a ed m a periodo completo con periodo sufficientemente lungo: per m = 2 31-1 esistono 534 milioni di moltiplicatori adatti occorre implementare la funzione f(z) in modo efficiente e coerente con le possibilità di rappresentazione numerica di una specifica macchina a=16807 ed m = 2 31-1 generano sequenze a periodo completo che hanno superato numerosi test statistici di casualità, ma, per una implementazione diretta della funzione di generazione, richiedono l'utilizzo di interi a 46 bit per contenere il massimo valore del prodotto a * z ogni sequenza deve essere inizializzata attribuendo un valore al seme la libreria stdlib.h del linguaggio C mette a disposizione la funzione rand() che produce un numero intero pseudo-casuale compreso fra 0 e RAND_MAX (costante pre-definita anch essa in stdlib.h) Numeri casuali e simulazione 4

ESEMPIO DI UTILIZZO DI rand() #include <stdlib.h> #include <stdio.h> #define N 10 int main(){ int i,r; printf( %d numeri a caso fra 0 e %d \n,n,rand_max); for (i=0;i<n;i++){ /* genera N numeri casuali */ r = rand(); printf( %d\n,r); return 0; si noti che successive esecuzioni di questo programma producono sempre lo stesso numero, perche all avvio del programma il seme viene sempre reinizializzato a 1 Numeri casuali e simulazione 5

se si vogliono generare sequenze diverse a ogni esecuzione è possibile utilizzare la funzione srand() per assegnare un valore al seme si può riottenere la stessa sequenza, per riprodurre uno stesso esperimento, riassegnando lo stesso valore #include <stdlib.h> #include <stdio.h> #define N 10 int main(){ int i,r; unsigned int s; /* seme */ printf( Inserire un numero per inizializzare la sequenza: ); scanf( %d,&s); srand(s); printf( %d numeri a caso fra 0 e %d \n,n,rand_max); for (i=0;i<n;i++){ /* genera N numeri casuali */ r = rand(); printf( %d\n,r); return 0; Numeri casuali e simulazione 6

Generazione di un numero intero con distribuzione uniforme fra 0 e 1 è sufficiente dividere il risultato di random per RAND_MAX double randr(){ return (double)rand()/rand_max; Generazione di uno fra n eventi con probabilità discreta p i sia P k = k " p i,1! k! n, probabilità cumulativa, P n = 1 i=1 si genera l'evento e i se P i-1 < randr P i (P 0 =0) la probabilità dell'evento e i è pari all'ampiezza dell'intervallo P i - P i-1 = p i Numeri casuali e simulazione 7

Distribuzione normale (cfr. teorema del limite centrale) È noto che una distribuzione normale è il limite della somma di variabili casuali con distribuzione uniforme date DN variabili indipendenti con distribuzione uniforme, media m e deviazione standard σ, la funzione z = (x 1 +...+x DN -DN*m)/σ *sqrt(12) approssima una variabile con distribuzione normale, valore medio 0 e deviazione standard 1 la somma di 12 valori ottenuti da RandR approssima una distribuzione normale con media 6 e σ=1 Osservazione: randnorm produce valori nell'intervallo m ± 6 σ Numeri casuali e simulazione 8