5.8 random -- Genera numeri pseudo casuali

Questo modulo implementa generatori di numeri pseudo casuali per varie distribuzioni.

Per numeri interi, la selezione avviene uniformemente da un intervallo. Per le sequenze, si seleziona uniformemente un elemento casuale, vengono fornite anche una funzione per generare una permutazione casuale sul posto di una lista ed una funzione per la campionatura casuale senza sostituzione.

Nel campo dei numeri reali, esistono funzioni per calcolare distribuzioni uniformi, normali (gaussiane), normali logaritmiche, esponenziali negative, gamma e beta. Per generare distribuzioni di angoli, è disponibile la distribuzione von Mises.

Quasi tutte le funzioni di questo modulo dipendono dalla funzione fondamentale random(), che genera uniformemente un numero in virgola mobile casuale nell'intervallo semi aperto [0.0; 1.0]. Python utilizza il Mersenne Twister come generatore principale. Esso produce numeri in virgola mobile con la precisione di 53 bit e dispone di un periodo di 2**19937-1. L'implementazione sottostante in C è sia veloce che sicura per i thread. Il Mersenne Twister è uno dei generatori di numeri casuali esistente più testati. Nonostante ciò, essendo completamente deterministico, non è adatto a tutti gli usi, ed è del tutto inutilizzabile per scopi crittografici.

Le funzioni fornite da questo modulo sono in realtà metodi legati ad un'istanza nascosta della classe random.Random. Potete creare le vostre istanze personali di Random per ottenere generatori indipendenti. Questo è utile soprattutto per programmi multi thread, creando differenti istanze di Random per ogni thread e usando il metodo jumpahead() si assicura che le sequenze generate in ogni thread non si sovrappongano.

Dalla classe Random si possono anche derivare delle sotto classi, nel caso in cui vogliate utilizzare per i vostri scopi un generatore di base differente: in quel caso, ridefinite i metodi random(), seed(), getstate(), setstate() e jumpahead(). Facoltativamente, un nuovo generatore può sostituire il metodo getrandombits() -- questo permette a randrange() di produrre selezioni in una sequenza arbitrariamente grande. Nuovo nella versione 2.4: il metodo getrandombits().

Come esempio di derivazione, il modulo random fornisce la classe WichmannHill che implementa un generatore alternativo in puro Python. La classe fornisce un modo retrocompatibile per riprodurre i risultati delle vecchie versioni di Python che usavano l'algoritmo Wichmann-Hill come generatore principale. Modificato nella versione 2.3: Sostituito Wichmann-Hill con MersenneTwister.

Funzioni di calcolo:

seed( [x])
Inizializza il generatore di base dei numeri casuali. L'argomento facoltativo x può essere un qualunque oggetto di cui si possa calcolare l'hash (NdT: hashable). Se x viene omesso o è None, si utilizza il tempo di sistema corrente; il tempo di sistema corrente viene usato anche per inizializzare il generatore quando si importa il modulo per la prima volta. Se l'argomento non è ne None ne un int e neppure un long, viene utilizzato hash(x). Se x è un int o un long, si usa direttamente x.

getstate( )
Restituisce un oggetto che contiene lo stato interno corrente del generatore. Questo oggetto può essere passato a setstate() per ristabilire lo stato. Nuovo nella versione 2.1.

setstate( state)
state deve essere un oggetto ottenuto da una precedente chiamata a getstate(), e setstate() ripristina lo stato interno del generatore come era al momento della chiamata di setstate(). Nuovo nella versione 2.1.

jumpahead( n)
Cambia lo stato interno in uno differente e probabilmente lontano dallo stato corrente. n è un intero non negativo che viene usato per rimescolare il vettore corrente degli stati. Questo è molto utile nei programmi multi thread, in combinazione con più istanze della classe Random: setstate() o seed() possono essere utilizzate per forzare tutte le instanze ad avere lo stesso stato, mentre jumpahead() ne forza l'allontanamento. Nuovo nella versione 2.1. Modificato nella versione 2.3: Invece di saltare ad uno specifico stato, n passi più avanti, jumpahead(n) salta ad un altro stato probabilmente separato da molti passi..

getrandbits( k)
Restituisce un intero long Python con k bit casuali. Questo metodo viene fornito con il generatore MersenneTwister ed anche alcuni altri generatori possono fornirlo come parte opzionale dell'API. Quando disponibile, getrandbits() abilita randrange() a gestire sequenze arbitrariamente grandi. Nuovo nella versione 2.4.

Funzioni per gli interi:

randrange( [start,] stop[, step])
Restituisce un elemento casuale nell'intervallo generato da range(start, stop, step). È equivalente a choice(range(start, stop, step)), ma non costruisce un oggetto range. Nuovo nella versione 1.5.2.

randint( a, b)
Restituisce un intero casuale N tale che a <= N <= b.

Funzioni per le sequenze:

choice( seq)
Restituisce un elemento casuale della sequenza non vuota seq.

shuffle( x[, random])
Rimescola la sequenza x sul posto. L'argomento facoltativo random è una funzione priva argomenti che restituisce un numero casuale in virgola mobile nell'intervallo [0.0; 1.0]; il valore predefinito è la funzione random().

Notate che anche per len(x) piuttosto piccolo, il numero totale di permutazioni di x è più grande del periodo della maggior parte dei generatori di numeri casuali; questo implica che la maggior parte delle permutazioni di una lunga sequenza non potrà mai essere generata.

sample( population, k)
Restituisce una lista di lunghezza k di elementi distinti, scelti dalla sequenza population. Viene usato per la campionatura casuale senza sostituzione. Nuovo nella versione 2.3.

Restituisce una nuova lista contenente elementi presi da population lasciando immutata la population originale. La lista ottenuta viene restituita in ordine di selezione così che ogni sotto lista sia un campionamento casuale valido. Questo permette di individuare tra i vincitori (il campionamento) il primo ed i secondi posti (le sotto liste).

Non è necessario che gli elementi di population siano utilizzabili da hash o che siano elementi distinti. Se population contiene elementi ripetuti, ogni occorrenza è una possibile selezione del campione.

Per scegliere un campione da un intervallo di interi, usate xrange come argomento. Questo è un metodo particolarmente veloce ed economico per la memoria di ottenere un campione da un'ampia popolazione: sample(xrange(10000000), 60).

Le seguenti funzioni generano specifiche distribuzioni di numeri reali. I parametri delle funzioni vengono ricalcati in base ai nomi delle variabili corrispondenti nelle equazioni delle distribuzioni, come si usa nella comune terminologia matematica; la maggior parte di queste equazioni si possono trovare in un qualunque testo di statistica.

random( )
Restituisce il prossimo numero in virgola mobile nell'intervallo [0.0; 1.0].

uniform( a, b)
Restituisce un numero reale casuale N tale che a <= N < b.

betavariate( alpha, beta)
Distribuzione Beta. Le condizioni per i parametri sono: alpha > -1 e beta > -1. I valori restituiti si trovano nell'intervallo fra 0 e 1.

expovariate( lambd)
Distribuzione esponenziale. lambd è 1.0 diviso la media desiderata. (Il parametro doveva chiamarsi ``lambda'', ma questa è una parola riservata in Python.) Il valore restituito è compreso tra 0 e l'infinito positivo.

gammavariate( alpha, beta)
Distribuzione Gamma. (Non funzione gamma!) Le condizioni sui parametri sono alpha > 0 e beta > 0.

gauss( mu, sigma)
Distribuzione gaussiana. mu è la media e sigma è la deviazione standard. Questa è leggermente più veloce della funzione normalvariate() definita qui sotto.

lognormvariate( mu, sigma)
Distribuzione normale logaritmica. Se prendete il logaritmo naturale di questa distribuzione, otterrete la distribuzione normale con media mu e deviazione standard sigma. mu può avere ogni valore mentre sigma deve essere maggiore di zero.

normalvariate( mu, sigma)
Distribuzione normale. mu è la media e sigma è la deviazione standard.

vonmisesvariate( mu, kappa)
mu è l'angolo medio, espresso in radianti con un valore compreso tra 0 e 2*pi, mentre kappa è il parametro di concentrazione, che deve essere maggiore o uguale a zero. Se kappa è uguale a zero, questa distribuzione si restringe ad un angolo casuale costante, compreso nell'intervallo tra 0 e 2*pi.

paretovariate( alpha)
Distribuzione Pareto. alpha è il parametro di forma.

weibullvariate( alpha, beta)
Distribuzione Weibull. alpha è il parametro di scala e beta il parametro di forma.

Generatori alternativi

class WichmannHill( [seed])
Classe che implementa l'algoritmo Wichmann-Hill come generatore principale. Possiede gli stessi metodi di Random più il metodo whseed descritto sotto. Poiché questa classe è implementata in puro Python, non è threadsafe e potrebbe richiedere lock tra le chiamate. Il periodo del generatore è 6.953.607.871.644 che è abbastanza piccolo da richiedere attenzione affichè due sequenze casuali indipendenti non si sovrappongano.

whseed( [x])
Questo metodo è obsoleto, supportato per la compatibilità a livello di bit con le versioni di Python precedenti alla 2.1. Vedete seed per i dettagli. whseed non garantisce che diversi argomenti interi producano diversi stati interni e non può generare più di 2**24 stati interni distinti.

Vedete anche:

M. Matsumoto and T. Nishimura, ``Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator'', ACM Transactions on Modeling and Computer Simulation Vol. 8, No. 1, January pp.3-30 1998.

Wichmann, B. A. & Hill, I. D., ``Algorithm AS 183: An efficient and portable pseudo-random number generator'', Applied Statistics 31 (1982) 188-190.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.