• Non ci sono risultati.

C Numeri casuali

N/A
N/A
Protected

Academic year: 2021

Condividi "C Numeri casuali"

Copied!
3
0
0

Testo completo

(1)

C.1

C Numeri casuali

C.1 Introduzione

Il prossimo insieme di algoritmi che prenderemo in considerazione è costituito dai metodi utilizzati da un elaboratore per generare numeri casuali. Pur avendo più volte incontrato i numeri casuali in diversi contesti, è bene cominciare a capire cosa siano in realtà.

Capita spesso, durante una conversazione, do confondere il termine casuale (o random) con il termine arbitrario[65]. Avere la necessità di un numero arbitrario significa in realtà che non ha importanza il valore del numero, in quanto un qualsiasi numero è adatto allo scopo. Viceversa, un numero casuale è un concetto matematico ben definito, che identifica un numero estratto da un insieme di valori equiprobabili. Mentre un numero casuale può soddisfare una richiesta di un numeri arbitrario, non è vero il contrario.

Perché abbia senso l’affermazione “insieme di valori equiprobabili”, è necessario limitare i numeri da adoperare ad un dominio finito. Non è possibile avere un numero intero casuale, ma solamente un numero intero casuale appartenente ad un dato intervallo; analogamente, non esiste un numero reale casuale, mentre è possibile parlare di frazioni casuali definite in un certo intervallo ed aventi una precisione stabilita.

Quasi sempre si ha la necessità di gestire non un numero ma una sequenza di numeri casuali (altrimenti ci si potrebbe accontentare di un valore arbitrario). A questo punto ci si appella alla matematico, essendo possibile dimostrare molti risultati riguardanti le proprietà delle sequenze di numeri casuali. Ad esempio, in una sequenza molto lunga di numeri casuali appartenenti ad un dominio ristretto, ci si può aspettare che ogni valore compaia circa allo stesso numero di volte. Le sequenze casuali possono essere sfruttate per modellare molte situazioni naturali, grazie anche alla profonda conoscenza delle loro proprietà. Per usare la terminologia corrente, ci si riferirà ai numeri estratti da sequenze di numeri casuali con il termine di numeri casuali.

Non esiste alcun modo di produrre numeri realmente casuali utilizzando un elaboratore (o un qualsiasi altro dispositivo deterministico). Una volta scritto il programma, tutti i numeri da esso prodotti possono essere in qualche modo dedotti, per cui non è possibile che siano casuali. Il massimo che si può sperare è di scrivere programmi in rado di produrre sequenze di numeri capaci di soddisfare molte delle proprietà dei numeri casuali. Solitamente ci si riferisce a questo genere di

(2)

C.2 numeri chiamandoli pseudo-casuali (pseudo-random): questi, pur non essendo realmente casuali, possono essere considerati un’approssimazione dei numeri casuali, così come i numeri in virgola mobile possono essere visti come approssimazioni dei numeri reali.

C.2 Metodo della congruenza lineare

Il metodo più conosciuto per la generazione di numeri casuali, praticamente l’unico utilizzato sin dalla sua introduzione nel 1951 da parte di D.Lehmer, è il cosiddetto metodo della congruenza

lineare[62].

Xn= (c x Xn-1+ao)MOD (Nmax )

In altre parole, per calcolare un nuovo numero casuale, si prende quello precedentemente trovato, lo si moltiplica per una costante c, gli si aggiunge ao e si prende il resto della divisione per un’altra

costante Nmax. Il risultato è sempre un intero compreso tra 0 e Nmax -1. Questo metodo diventa

particolarmente interessante da utilizzare per un elaboratore, vista la semplicità con la quale è solitamente implementata la funzione MOD: se si trascura l’overflow legato all’esecuzione di operazioni aritmetiche, l’hardware stesso della maggior parte degli elaboratori si limita ad eliminare i bit superflui, eseguendo l’operazione MOD relativa a valori di Nmax che superano di uno il più

grande intero rappresentabile in una parola.

C.3 Numeri casuali con distribuzione gaussiana

Fino ad ora si è parlato esclusivamente ( e si continuerà a farlo) di numeri casuali uniformi, per i quali tutti i valori sono equiprobabili. E’ altrettanto comune avere a che fare con numeri casuali che obbediscono ad un altro tipo di distribuzione, per la quale alcuni valori hanno una probabilità maggiore di altri di essere estratti. I numeri pseudo-casuali con distribuzione non uniforme sono solitamente generati effettuando alcune operazioni sui corrispondenti valori uniformemente distribuiti.

Nel nostro caso è stato usato il metodo polare per la generazione di numeri casuali ; questo algoritmo calcola due variabili indipendenti X1 e X2 con distribuzione normale. L’algoritmo è il

seguente [64]:

• P1 [fornisce variabili uniformi]. Genera due variabili indipendenti casuali, U1 e U2,

uniformemente distribuiti tra 0 e 1. Si pone V1 = 2U1-1, V2=2U2-1. (Ora V1 e V2 sono

uniformemente distribuiti tra -1 e +1. Sulla maggior parte dei computer è preferibile avere V1e V2rappresentati in virgola mobile.)

(3)

C.3 • P2. [Calcolo S.] Si pone S=V12+ V22

• P3. [E’ SF1 ?] Se SF1, si ritorna al passo P1. (I passi P1 attraverso P3 sono eseguiti 1.27 volte in media, con una deviazione standard di 0.587)

• P4. [Calcolo X1,X2.] Se S=0, si pone X1=X2=0; altrimenti si pone

S S ln 2 V X1 = 1 S S ln 2 V X2 = 2

Riferimenti

Documenti correlati

Una macchina ha una vita media prima di subire guasti di 6 anni (ipotizzare una distribuzione esponenziale). Un acquirente compera 10 macchine di questo tipo e vuole sapere qual è la

Un acquirente compera 12 macchine di questo tipo e vuole sapere qual è la probabilità che al massimo una di esse si guasti entro 2 anni. Dopo 5 anni, quanto è il numero di

Esercitazione: Trasformazione di Variabili Casuali. Misure Meccaniche e Termiche

Come sappiamo, in una data prova non si può conoscere quale valore assumerà la nostra variabile casuale; ma se conosciamo tutti i possibili valori che la nostra variabile

Come possiamo generare una lista di numeri (pseudo)casuali?... numeri pseudocasuali

Osservazione 3.5 Nel caso in cui E `e un insieme finito o numerabile, segue dalla Proposi- zione 3.4 che la coppia (E, µ X ) `e uno spazio di probabilit`a discreto. Va tuttavia

 

In questo modo l’istruzione: srand (time(NULL)); inizializza il generatore ad ogni esecuzione con un valore (seme) diverso e le successive istruzioni rand()