Il generatore di numeri casuali
|
|
|
- Simone Deluca
- 9 anni fa
- Visualizzazioni
Transcript
1 Il generatore di numeri casuali file di libreria: stdlib.h int rand(void) La funzione restituisce un numero casuale di tipo intero compreso tra 0 e RAND_MAX (estremi compresi) Esempio: scriviamo un programma che permetta di generare un numero casuale; facciamo poi in modo che il numero casuale sia compreso all interno di un prefissato intervallo. // per la funzione printf() #include <stdlib.h> // per la funzione rand() {int casuale; casuale = rand() /* il numero casuale viene generato ed il suo valore viene salvato in casuale casuale risulta compreso tra 0 e RAND_MAX. E se vogliamo che sia compreso tra 30 e 70? Posso pensare di ottenere questo risultato sommando a 30 un numero casuale compreso tra 0 e 40 (ovvero ) */ casuale=30 + rand()%41; // Il resto di una divisione per 41 al massimo vale 40 // avendo usato l operatore resto, questo procedimento si può usare solo con le variabili di tipo int
2 Implementiamo una funzione che serva a generare valori casuali, di tipo intero, compresi tra un valore massimo ed un valore minimo; valore massimo e minimo devono essere scelti al momento della chiamata alla funzione. // prima versione int IntCasuale(int,int); // 2 parametri per scegliere minimo e massimo, 1 valore intero da restituire int IntCasuale(int minimo,int massimo) {int numero; numero=rand()%(massimo-minimo+1)+minimo; return numero; // seconda versione int IntCasuale(int,int); // 2 parametri per scegliere minimo e massimo, 1 valore intero da restituire int IntCasuale(int minimo,int massimo) { // restituisco il valore non appena esso viene generato return rand()%(massimo-minimo+1)+minimo;
3 Implementiamo una funzione che serva a generare valori casuali, di tipo float, compresi tra un valore massimo ed un valore minimo; valore massimo e minimo devono essere scelti al momento della chiamata alla funzione. Se min e max rappresentano gli estremi dell intervallo a cui devono appartenere i numeri casuali... La matematica ci insegna che, dato un numero casuale, x, compreso tra 0 e RAND_MAX y = (x/rand_max) * (max-min) + min; compreso tra min e max compreso tra 0 e 1 compreso tra 0 e (max-min) Trovare l errore... float FloatCasuale(float,float); // 2 parametri per scegliere minimo e massimo, 1 valore float da restituire float FloatCasuale(float minimo,float massimo) { return (rand()/rand_max)*(massimo-minimo) + minimo;
4 Costrutti iterativi: for e while for(inizio ; continuazione ; finale ) { istruzioni inizio: espressione valutata prima di iniziare il ciclo continuazione: espressione valutata prima di ogni iterazione quando essa risulta falsa le istruzioni non vengono eseguite finale: espressione valutata dopo l esecuzione delle istruzioni while( continuazione ) { istruzioni continuazione: espressione valutata prima di ogni iterazione quando essa risulta falsa le istruzioni non vengono eseguite Per terminare l esecuzione di uno dei due cicli, usare l istruzione break; for(inizio ; continuazione ; finale ) { istruzioni i costrutti sono equivalenti inizio; while( continuazione ) { istruzioni finale;
5 Implementiamo un programma che permetta di generare un numero prefissato di valori casuali. Il programma deve richiamare la funzione IntCasuale(int,int) per generare valori interi casuali compresi tra -10 e 10 #include <stdlib.h> int IntCasuale(int,int); {int casuale,i; for(i=0 ; i<50 ; i=i+1) {casuale=intcasuale(-10,10); printf( Ecco il numero casuale numero %d: %d\n,i,casuale); // i rientri nel codice favoriscono la leggibilità del // codice stesso int IntCasuale(int min,int max) {return rand()%(max-min+1)+min; Facciamo in modo di poter utilizzare la funzione IntCasuale() da un qualsiasi programma... ->
6 Separiamo il testo del codice: funzioni.h contiene prototipo ed implementazione della funzione, oltre alle direttive per il preprocessore che permettono l utilizzo di funzioni di libreria richiamate dalla funzione casuale.c contiene il testo del programma vero e proprio, chiamate alle funzioni e le direttive per il preprocessore che permettono l utilizzo di funzioni di libreria chiamate dalla funzione main() casuale.c funzioni.h #include funzioni.h {int casuale,i; for(i=0 ; i<50 ; i=i+1) {casuale=intcasuale(-10,10); printf( Ecco il numero casuale numero %d: %d\n,i,casuale); #include <stdlib.h> int IntCasuale(int,int); int IntCasuale(int min,int max) {return rand()%(max-min+1)+min; Così facendo, a patto di includere il file funzioni.h, da un qualsiasi codice sarà possibile effettuare chiamate alla funzione IntCasuale()
7 Ricordiamoci che il costrutto for() valuta delle espressioni... #include funzioni.h {int casuale,i; for(i=0 ; i<50 ; i=i+1) {casuale=intcasuale(-10,10); printf( numero %d: %d\n,i,casuale); #include funzioni.h {int i; for(i=0 ; i<50 ; printf( numero %d: %d\n,i, IntCasuale(-10,10));) { i=i+1; #include funzioni.h {int i; for(i=0 ; i<50 ; i=i+1) { printf( numero %d: %d\n,i, IntCasuale(-10,10)); #include funzioni.h {int i; for(i=0;i<50 ;printf( numero %d:%d\n,i++, IntCasuale(-10,10));) { ;
8 La direttiva #define La direttiva #define appartiene al gruppo di istruzioni che permettono di gestire l azione del preprocessore. Tale direttiva permette di definire una MACRO, ovvero un etichetta, un simbolo, e di assegnare a tale MACRO un valore; ogni volta che il preprocessore incontra la MACRO nel codice, esso sostituisce alla MACRO il valore scelto dal programmatore. Il valore della MACRO viene INSERITO al posto della MACRO stessa, senza alcun controllo. DOPO la sostituzione, sarà poi il compilatore ad analizzare il codice ed a verificarne la correttezza sintattica. #define INTERO 30 #define CIAO printf( ciao, questa frase l ho scritta con una MACRO!\n ); {int i; macro.c CIAO // NOTA: il ; è già inserito nella MACRO, non serve indicarlo qui! i=intero; Scriviamo questo codice e poi compiliamo con il comando gcc E macro.c cosa risulta?
9 Nel caso in cui il testo della MACRO fosse particolarmente lungo... possiamo andare a capo. #define LONG_MACRO printf( Questa MACRO viene definita usando varie righe;\n ); \ printf( per la definizione e sufficiente inserire alla fine di ogni riga\n ); \ printf( un carattere speciale: \\ \n ); {LONG_MACRO La MACRO può essere definita all atto della compilazione direttiva.c Al momento della compilazione usare il comando: {int i; i=valore; printf( Il valore di i risulta: %d\n,i); gcc o direttiva Wall DVALORE=5 direttiva.c L opzione D indica che si sta per definire una macro Subito dopo D, SENZA SPAZI, va indicato il nome della macro e poi il suo valore
10 La cosa può tornare utile, ad esempio, per inizializzare il generatore di numeri casuali. La libreria standard include un generatore di numeri casuali, rand(); la funzione genera numeri casuali a partire da un valore iniziale fissato dalla libreria stdlib.h. VALORE INIZIALE nuovo valore nuovo valore nuovo valore algoritmo algoritmo algoritmo Se il primo valore, il SEME, rimane costante, allora la sequenza sarà sempre la stessa. Per cambiare il seme, si può usare la funzione void srand(int); il parametro rappresenta il valore del seme #include <stdlib.h> inizio.c {int i; srand(inizio); i=rand(); printf( Il valore di i risulta: %d\n,i); gcc o inizio Wall DINIZIO=50 inizio.c
11 Implementiamo un costrutto che ci permetta di pulire il buffer di input e trasformiamolo in una MACRO {char carattere; printf( Inserisci un carattere: ); carattere=getchar(); // per eliminare eventuali altri caratteri chiamo la funzione getchar() fino a quando trovo LF while(carattere!=10) {carattere=getchar(); {char carattere; printf( Inserisci un carattere: ); carattere=getchar(); // per eliminare eventuali altri caratteri chiamo la funzione getchar() fino a quando trovo LF while(getchar()!=10) {; // analizzo il valore, senza assegnarlo ad alcuna variabile
12 Implementiamo un costrutto che ci permetta di pulire il buffer di input e trasformiamolo in una MACRO #define CLEAN_BUFFER while(getchar()!=10) {; {char carattere; printf( Inserisci un carattere: ); carattere=getchar(); CLEAN_BUFFER // non serve il ;! La definizione della MACRO può essere inserita nel file funzioni.h, in modo da poterla richiamare da un qualsiasi file in cui sia necessario effettuare la pulizia del buffer di input.
13 Esercizi proposti (1) Implementare una funzione che non accetti alcun parametro e che restituisca un valore di tipo int. La funzione deve generare un numero intero di tipo casuale compreso tra 97 e 122, estremi inclusi. Fatto questo la funzione deve restituire tale valore casuale. NOTA: gli estremi dell intervallo in cui devono cadere i numeri casuali vanno definiti come MACRO (2) Scrivere un programma in cui venga chiesto all utente di inserire un carattere da tastiera; una volta che l utente ha inserito il carattere, il programma deve confrontare tale carattere con quello generato usando la funzione definita al punto precedente. Visualizzare un messaggio in modo tale che l utente sappia se ha indovinato quale sia il carattere generato casualmente o meno; in particolare visualizzare sia il carattere inserito dall utente che quello generato dalla funzione. (3) Scrivere un programma simile al precedente, ma in cui l utente possa effettuare più tentativi per indovinare quale sia il carattere generato in modo casuale; dopo ogni tentativo, all utente deve essere chiesto se intenda effettuare un nuovo tentativo o meno. Per implementare questo programma servirsi del costrutto for(); per la terminazione del ciclo servirsi dell istruzione break (4) Scrivere un programma simile al precedente servendosi del costrutto while(), per la terminazione del ciclo NON servirsi dell istruzione break (5) Scrivere un programma che svolga le stesse operazioni di quello descritto al punto (3) servendosi di una funzione implementata in modo ricorsivo
ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }
ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il
La gestione dei caratteri in C
in C In C i caratteri sono gestiti mediante variabili di tipo char (interi a 8 bit) Ad ogni carattere corrisponde un codice numerico ASCII (American Standard Code for Information Interchange) Un esempio
Laboratorio di Programmazione: Linguaggio C Lezione 9 del 27 novembre 2013
Laboratorio di Programmazione: Linguaggio C Lezione 9 del 27 novembre 2013 Damiano Macedonio Giochi d Azzardo Note Iniziali Per generare un numero casuale basta includere la libreria stdlib.h e utilizzare
Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.
Unità Didattica 1 Linguaggio C Fondamenti. Struttura di un programma. 1 La storia del Linguaggio C UNIX (1969) - DEC PDP-7 Assembly Language BCPL - un OS facilmente accessibile che fornisce potenti strumenti
L AMBIENTE CODE BLOCKS E L IO
L AMBIENTE CODE BLOCKS E L IO Il primo programma in C++ #include using namespace std; main() { cout
L AMBIENTE CODE BLOCKS E L IO
L AMBIENTE CODE BLOCKS E L IO Il primo programma #include main() { printf("ciao Mondo!"); } Il file deve essere salvato con estensione.c Il primo programma in C++ #include using
Esercitazione 4. Comandi iterativi for, while, do-while
Esercitazione 4 Comandi iterativi for, while, do-while Comando for for (istr1; cond; istr2) istr3; Le istruzioni vengono eseguite nel seguente ordine: 1) esegui istr1 2) se cond è vera vai al passo 3 altrimenti
Lettura da tastiera e scrittura su monitor
Lettura da tastiera e scrittura su monitor Per poter leggere UN SINGOLO CARATTERE dalla tastiera e visualizzare UN SINGOLO CARATTERE sul monitor si possono utilizzare le funzioni: int getchar (void) (per
Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin
Linguaggio C strutture di controllo: strutture iterative Università degli Studi di Brescia Docente: Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1 Strutture iterative
Generazione di numeri pseudo-casuali
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
Introduzione al C. Esercitazione 6. Raffaele Nicolussi. Corso di Fondamenti di Informatica Ingegneria Clinica
Corso di Fondamenti di Informatica Ingegneria Clinica Esercitazione 6 Raffaele Nicolussi Esercizio 1 Si scriva una funzione in linguaggio C che riceve in ingresso un numero intero A letto da tastiera,
Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22
Lezione 21 e 22 - Allocazione dinamica delle matrici - Generazione di numeri pseudocasuali - Funzioni per misurare il tempo - Parametri del main - Classificazione delle variabili Valentina Ciriani (2005-2008)
Esercizi. La funzione swapint() primo tentativo
Politecnico di Milano Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio di array. #include
Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione
Primo programma in C
Primo programma in C Struttura minima di un file C Applicazioni C in modo console Struttura del programma Commenti Direttive #include Definizione di variabili Corpo del main 2 Struttura minima di un file
3 Costrutti while, for e switch
Questa dispensa propone esercizi sulla scrittura di algoritmi, in linguaggio C, utili alla comprensione dei costrutti while, for e switch. I costrutti per costruire cicli in C sono il while, la variante
Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.
Unità Didattica 3 Linguaggio C Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore. Funzioni Generalizzazione del concetto di funzione algebrica: legge che associa
Introduzione al linguaggio C Funzioni
Introduzione al linguaggio C Funzioni Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati
Qualsiasi programma in C++ segue lo schema:
Qualsiasi programma in C++ segue lo schema: #include // libreria che gestisce flusso di input e output using namespace std; // uso di librerie standard del C++ int main() { // dichiarazioni
Introduzione alla programmazione in linguaggio C
Introduzione alla programmazione in linguaggio C Il primo programma in C commento Header della libreria Funzione principale Ogni istruzione in C va terminata con un ; Corso di Informatica AA. 2007-2008
Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);
Un esempio per iniziare Il controllo del programma in C DD Cap.3 pp.91-130 /* calcolo di 8!*/ #include #define C 8 int main() int i=1; int fatt=1; while (i
LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO III Indice
LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO 2014 2015 18.III.2015 VINCENZO MARRA Indice Parte 1. L algoritmo euclideo 3 Esercizio 1 3 L algoritmo euclideo
Programmazione I - Laboratorio
Programmazione I - Laboratorio Esercitazione 3 - Array Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti di.unipi.it 2. Dipartimento
Variabili e Istruzioni
Exit Menù Variabili e Istruzioni 1 Le Variabili Una VARIABILE è un oggetto identificato da un NOME e da uno STATO, detto CONTENUTO o VALORE. Possiamo immaginarla come una scatola contenuto Pippo 11 nome
