Generazione di numeri pseudo-casuali

Documenti analoghi
NUMERI CASUALI E SIMULAZIONE

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

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

Algoritmi in C++ (prima parte)

Programmazione I - Laboratorio

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

Corso sul linguaggio C

Laboratorio di Calcolo I. Applicazioni : Metodo Monte Carlo

Il generatore di numeri casuali

Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017

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

Corso di Informatica 1 Esercitazione n. 4

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

Fondamenti di Programmazione

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

Programmazione I - Laboratorio

Algoritmi in C++ (seconda parte)

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Stringhe e allocazione dinamica della memoria

Uso delle funzioni della libreria GSL

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

Algoritmo di ordinamento per sostituzione. Esempio : dato l array :

Il linguaggio C. Puntatori e dintorni

Le funzioni, e le istruzioni di input/output

Introduzione alla probabilità. Renato Mainetti

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

Transcript:

Generazione di numeri pseudo-casuali

Perchè è difficile? Il computer esegue deterministacamente le istruzioni fornite dal programma Questo comporta che è molto difficile ottenere vera casualità (ossia eventi statisticamente non predicibili) con un computer Il C fornisce delle funzioni di libreria generano sequenze di numeri pseudocasuali Vedremo rand()e srand()

Sequenze pseudo-casuali x 0 x 1 x 2 x k 1 x k Sono sequenze in cui ciascun elemento (x k ) è costruito a partire dall'elemento precedente (x k 1 ) usando vari algoritmi Sono costruiti in modo che la distribuzione dei valori ottenuti approssimi la distribuzione uniforme in un certo intervallo Il primo elemento (x 0 ) è detto seme della sequenza A partire dallo stessa seme la sequenza generata è sempre la stessa

Generare la sequenza in C x 0 x 1 x 2 x k 1 x k Si usano due funzioni di libreria standard rand()e srand()

Generare la sequenza in C x 0 x 1 x 2 x k 1 x k Si usano due funzioni di libreria standard srand()e rand() srand()viene utilizzata una sola volta per fissare il seme

Generare la sequenza in C x 0 x 1 x 2 x k 1 x k Si usano due funzioni di libreria standard srand()e rand() srand()viene utilizzata una sola volta per fissare il seme rand()viene utilizzata per generare il resto della sequenza (ogni volta che viene chiamata fornisce il valore successivo)

Vediamo un esempio Generiamo i primi due numeri della sequenza di seme 42 #include <stdio.h> #include <stdlib.h> int main(void) { } int n1, n2; srand(42); n1 = rand(); n2 = rand(); printf("primi due numeri: %d e %d", n1, n2); return 0;

Vediamo un esempio Generiamo i primi due numeri della sequenza di seme 42 #include <stdio.h> #include <stdlib.h> int main(void) { } int n1, n2; srand(42); n1 = rand(); n2 = rand(); printf("primi due numeri: %d e %d", n1, n2); return 0; Serve a usare le funzioni rand() e srand()

Vediamo un esempio Generiamo i primi due numeri della sequenza di seme 42 #include <stdio.h> #include <stdlib.h> int main(void) { } int n1, n2; srand(42); n1 = rand(); n2 = rand(); printf("primi due numeri: %d e %d", n1, n2); return 0; Fissa il seme al valore 42

Vediamo un esempio Generiamo i primi due numeri della sequenza di seme 42 #include <stdio.h> #include <stdlib.h> int main(void) { } int n1, n2; srand(42); n1 = rand(); n2 = rand(); printf("primi due numeri: %d e %d", n1, n2); return 0; Genera x 1

Vediamo un esempio Generiamo i primi due numeri della sequenza di seme 42 #include <stdio.h> #include <stdlib.h> int main(void) { } int n1, n2; srand(42); n1 = rand(); n2 = rand(); printf("primi due numeri: %d e %d", n1, n2); return 0; Genera x 2

Intervallo di generazione La funzione rand() restituisce un numero (ogni volta diverso) compreso fra 0 e RAND_MAX (una costante molto grande, di solito 2 31 ma comunque più grande di 2 15 ) Si può stabilire sperimentalmente... Come?

Intervallo di generazione La funzione rand() restituisce un numero (ogni volta diverso) compreso fra 0 e RAND_MAX (una costante molto grande, di solito 2 31 ma comunque più grande di 2 15 ) Si può stabilire sperimentalmente #include <stdio.h> #include <stdlib.h> int main(void) { } printf ("RAND_MAX: %d\n", RAND_MAX); return 0;

Cambiare il seed/seme iniziale Si può utilizzare la funzine time() che restituisce il numero di secondo passati dal 1 Gennaio 1970 per fornire il seme Se le esecuzioni non sono troppo veloci (avvengono in secondi diversi) abbiamo un valore diverso per il seme assicurato Vediamo un esempio

Esempio Generare una sequenza di N interi nell'intervallo [0,RAND_MAX] con seme generato usando time()

Esempio #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 100 int main(void) { int i; srand(time(null)); for (i=0; i< N; i++) { printf ("%d\n", rand()); return 0; }

Generare in intervalli diversi Intervallo intero [A,B]?

Generare in intervalli diversi Intervallo intero [A,B] r = A + rand %(B A + 1)

Esempio Generare una sequenza di N interi in [A,B] int main(void) { int i, r; srand(time(null)); for (i=0; i< N; i++) { r = A + rand()%(b-a + 1); printf ("%d\n", r); } return 0; }

Generare in intervalli diversi Intervallo intero [A,B] r = A + rand %(B A + 1) Intervallo reale [0,1) r = rand /(RAND_MAX + 1.0) Intervallo reale [0,1) con precisione alla terza cifra decimale?