
Il modulo random in Python
Parliamo del modulo random di Python, una libreria incorporata che ti permette di generare numeri casuali.
Questo modulo può essere utile in vari scenari, come simulazioni, giochi, test di algoritmi, e persino in crittografia, anche se per quest'ultimo uso ci sono moduli più sicuri dal punto di vista crittografico, come `secrets`.
Cominciamo con qualcosa di semplice.
Puoi utilizzare il modulo random per generare un numero casuale.
import random
# Genera un numero intero casuale tra 1 e 10
numero = random.randint(1, 10)
print(numero)
Questo script genera un numero casuale intero tra 1 e 10 tramite il metodo randint().
Ad esempio, il numero 3
3
E' solo una delle funzionalità più conosciute di questo modulo che, in realtà, ne nasconde molte altre.
Ad esempio, oltre a generare numeri interi, puoi mescolare una lista o estrarre elementi casuali da una sequenza.
Questo è particolarmente utile quando vuoi selezionare un campione casuale da un insieme di dati o quando devi mescolare le carte in un gioco.
Nei prossimi paragrafi ti parlo di queste altre applicazioni del modulo random.
Mescolare degli elementi di una lista
Il metodo shuffle() del modulo random ti permette di mescolare gli elementi di una lista.
Ecco un esempio pratico.
import random
# Mescola una lista
lista = [1, 2, 3, 4, 5]
random.shuffle(lista)
print(lista)
Questo script utilizza il modulo random di Python per mescolare in modo casuale gli elementi di una lista [1,2,3,4,5] che in questo caso contiene i numeri dall'1 al 5.
La funzione random.shuffle() riordina gli elementi della lista in un ordine casuale.
Un possibile output potrebbe essere:
[2, 4, 1, 5, 3]
La lista mescolata contiene una sequenza degli stessi numeri della lista iniziale ma in un ordine casuale e diverso ogni volta che lo script viene eseguito.
Estrazione di un elemento casuale da una lista
Il metodo choice() ti permette di estrarre un elemento casuale da una lista.
import random
# Estrai un elemento casuale dalla lista
lista = [1, 2, 3, 4, 5]
elemento = random.choice(lista)
print(elemento)
Questo script utilizza il metodo random.choise() per selezionare un elemento in modo casuale da una lista prefissata di numeri interi che va da 1 a 5.
L'elemento selezionato viene poi assegnato alla variabile "elemento" e stampato sullo schermo.
Un output possibile potrebbe essere il numero 4
4
Estrazione di un campione casuale di n elementi dalla lista
Un altro metodo particolarmente utile del modulo random è sample() che ti permette di estrarre un campione di elementi dalla lista.
Ad esempio, questo script seleziona casualmente tre elementi unici dalla lista [1, 2, 3, 4, 5] e li stampa.
import random
# Estrazione di un campione di 3 elementi dalla lista
lista = [1, 2, 3, 4, 5]
campione = random.sample(lista, 3)
print(campione)
Il metodo random.sample() ha due parametri: la lista da cui vuoi estrarre il campione e il numero di elementi nel campione.
Ecco un possibile output dello script
[2, 1, 5]
Il campione è composto da tre elementi della lista presi casualmente e senza ripetizioni.
Le distribuzioni di probabilità
La bellezza del modulo random non si limita alla generazione di interi o alla manipolazione di liste.
Puoi anche generare numeri basati su distribuzioni probabilistiche.
Questo è fondamentale in molti campi scientifici, come la fisica, l'economia e la biologia, dove modelli realistici di fenomeni naturali richiedono l'uso di distribuzioni specifiche.
Ad esempio, questo script genera un numero casuale utilizzando una distribuzione uniforme tramite il metodo random.uniform().
import random
uniforme = random.uniform(1, 10)
print(uniforme)
7.598591990243651
Quest'altro script, invece, genera un numero casuale da una distribuzione gaussiana (o normale) tramite il metodo random.gauss()
import random
gaussiana = random.gauss(0, 1)
print(gaussiana)
1.5511074196756371
In entrambi i casi viene generato un numero casuale ma utilizzando una distribuzione di probabilità differente.
Utilizzare distribuzioni di probabilità diverse permette di modellare accuratamente fenomeni reali variando in base alla loro natura specifica, come eventi rari, fenomeni periodici o comportamenti di coda lunga.
Ciò ti consente di creare simulazioni e analisi più precise e rappresentative del mondo reale.
Qual è la differenza tra la distribuzione uniforme e la distribuzione gaussiana? La distribuzione uniforme assegna la stessa probabilità a tutti i valori all'interno di un intervallo definito, risultando in un aspetto piatto e costante; è come se ogni numero avesse la stessa chance di essere estratto in una lotteria. La distribuzione gaussiana o normale, invece, concentra la maggior parte delle probabilità intorno a un valore medio, con le probabilità che diminuiscono simmetricamente man mano che ci si allontana da questo centro, assomigliando alla forma di una campana. Questo riflette situazioni naturali come l'altezza degli individui in una popolazione, dove la maggior parte delle persone ha un'altezza vicina alla media e pochissime sono estremamente basse o alte.
Il seed nella generazione dei numeri casuali
Una parte intrigante della generazione di numeri casuali è il concetto di "seed" (o seme).
Se imposti un seed specifico, la sequenza di numeri generati sarà sempre la stessa.
A cosa serve? Avere la stessa sequenza di numeri generati casualmente è molto utile se vuoi riprodurre sempre gli stessi eventi nel corso di più esperimenti o test. E' molto utile nelle simulazioni.
Ecco un esempio pratico.
import random
random.seed(42)
# Estrazione di un campione di 3 elementi dalla lista
lista = [1, 2, 3, 4, 5]
campione = random.sample(lista, 3)
print(campione)
In questo script il metodo random.seed() fissa il seme al numero intero 42.
Poi estrae un campione di tre elementi dalla lista.
[1, 5, 3]
In questo caso la sequenza di numeri generati sarà sempre la stessa.
Modificando il valore del seme, puoi generare sequenze casuali diverse. Per esempio, se scegli un seme come 31 o 20, invece che 42, otterrai un'altra sequenza di numeri casuali unica e distinta rispetto agli altri semi
In altre parole, una volta che imposti un seme con il metodo seed(), puoi eseguire lo script più volte, o in diversi giorni, ma l'output generato in modo casuale sarà sempre lo stesso.
In questo esempio sarà sempre [1, 5, 3].
[1, 5, 3]
Il modulo random di Python è un esempio splendido di come qualcosa di apparentemente semplice, come generare numeri casuali, possa aprirci le porte a una comprensione più profonda di concetti matematici, scientifici e di programmazione.
Mi auguro che questa guida ti abbia fornito un assaggio della potenza e della flessibilità del modulo random in Python.