1 Generazione e test numeri casuali
Proviamo a implementare il semplice generatore di numeri casuali che sfrutta la formula 169 delle dispense, mediante le seguenti righe di codice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | def myrandgen(a,c,M,r0,n=1):
if n==1:
return mod(a*r0+c,M)
else:
r=zeros(n)
r[0]=r0
for i in range(1,n):
r[i]=mod(a*r[i-1]+c,M)
return r
i=0
sets=((57,1,25,13,'s'), (57,13,4097,13,'sg'), (57,17,4111,13,'sr'))
for a,c,M,r0,p in sets:
i+=1
r=myrandgen(a,c,M,r0,1000)
figure(i)
plot(r[:-1],r[1:],p)
xlabel(r'$r_i$',fontsize=25)
ylabel(r'$r_{i+1}$',fontsize=25)
title('a='+str(a)+', c='+str(c)+', M='+str(M)+', r0='+str(r0))
|
Vediamo prima un pò in dettaglio le precedenti linee di codice che contengono alcune cose ancora non viste riguardo la programmazione in Python:
- Per prima cosa, definiamo una funzione che partendo da 5 parametri di input, ci restituisce uno o piu valori random. I parametri a, c, M, r0 sono quelli necessari per poter calcolare la funzione 169 che genera il numero random successivo. Abbiamo inserito anche il parametro n con il quale specifichiamo quanti numeri random vogliamo generare. Poichè abbiamo posto n=1, se non viene specificato 1 sarà preso come valore di default. A seconda che n sia uguale o diverso da 1 creiamo uno o piu numeri random, ma la funzione di base è mod(n,m): essa restituisce il resto della divisione n diviso m. Nel caso che n sia diverso da uno creiamo un array di n zeri e mediante un ciclo for creiamo l'i-simo numero random partendo dal precedente e lo registriamo nella posizione i-sima. Una volta usciti dal ciclo chiediamo alla funzione di restituirci il vettore r appena creato.
- Ora vogliamo provare i tre differenti sets di variabili a, c, M, r0 proposti nelle dispense, in maniera smart. Creiamo una lista sets che contiene tre liste contenenti ognuna un set diverso di valori delle variabili. Sfruttiamo il fatto che in Python si possa fare un ciclo su una lista di liste, come la nostra sets, ed inoltre possiamo attribuire ogni singolo valore di ogni singola lista ad una variabile diversa. Quindi ad ogni ciclo le variabili a, c, M, r0 avranno i valori contenuti nelle liste di sets.
- All'interno del ciclo chiamiamo la nostra funzione myrandgen, che genera numeri random, in cui impostiamo a 1000 il numero n, mentre gli altri parametri cambieranno.
- Creiamo una figura e facciamo il plot di in funzione di : partendo dall'array r ne creiamo un altro che contenga tutti i valori di r dal primo al penultimo (r[:-1]) e un ancora altro che contenga tutti i valori di r dal secondo all'ultimo (r[1:]).
- Infine, impostiamo i label per gli assi usando una stringa simile al TeX, ponendo r prima degli apici; ingrandiamo anche un pochino la dimensione dei font modificando la variabile fontsize. Impostiamo anche il titolo scrivendo il set di variabili che stiamo usando per quel grafico.
- Nella funzione plot, notiamo anche la variabile in ingresso p, che viene impostata uguale al quinto valore di ogni lista. Questo, come vediamo, è una stringa di due caratteri: la s sta per square e le b,g,r stanno per i colori. Stiamo usando una forma contrattata per specificare che tipo di simbolo usare e di che colore vogliamo che sia.
Come discusso nelle dispense, i primi sets di variabili generano numeri random che dopo poco si ripetono, quindi delle sequenze con alta correlazione: nel primo grafico i punti son solo 4, nel secondo sono un centinaio, ma ne stiamo chiedendo 1000. Ne terzo grafico, la distribuzione uniforme dei punti ci fa essere più ottimisti che la sequenza generata sia abbastanza buona.