Moduli matematici in Python casuale

La casualità è intorno a noi. Quando lanci una moneta o tiri un dado, non puoi mai essere sicuro del risultato finale. Questa imprevedibilità ha un sacco di applicazioni come determinare i vincitori di una estrazione fortunata o generare casi di test per un esperimento con valori casuali prodotti in base a un algoritmo. 

Tenendo presente questa utilità, Python ci ha fornito il modulo random. Puoi usarlo nei giochi per generare nemici in modo casuale o per mescolare gli elementi in un elenco. 

Come funziona a caso?

Quasi tutte le funzioni di questo modulo dipendono dalla base casuale() funzione, che genererà un float casuale maggiore o uguale a zero e inferiore a uno. Python usa il Mersenne Twister per generare i float. Produce galleggianti di precisione a 53 bit con un periodo di 2 ** 19937-1. In realtà è il generatore di numeri pseudo-casuali per uso generico più diffuso.

A volte, vuoi che il generatore di numeri casuali riproduca la sequenza di numeri che ha creato la prima volta. Questo può essere ottenuto fornendo lo stesso valore di seme entrambe le volte al generatore usando il seme (s, versione) funzione. Se il parametro S viene omesso, il generatore utilizzerà l'ora corrente del sistema per generare i numeri. Ecco un esempio:

import random random.seed (100) random.random () # restituisce 0.1456692551041303 random.random () # restituisce 0.45492700451402135

Tieni presente che a differenza del lancio di una moneta, il modulo genera numeri pseudo casuali che sono completamente deterministici, quindi non è adatto per scopi crittografici.

Generazione di numeri casuali

Il modulo ha due diverse funzioni per generare numeri casuali interi. Puoi usare randrange (a) generare un numero intero casuale più piccolo di un

Allo stesso modo, puoi usare randrange (a, b [, step]) per generare un numero casuale da  intervallo (a, b, passo). Ad esempio, utilizzando random.randrange (0, 100, 3) restituirà solo quei numeri tra 0 e 100 che sono anche divisibili per 3.

Se conosci sia il limite inferiore e superiore tra i quali vuoi generare i numeri, puoi utilizzare una funzione più semplice e intuitiva chiamata randint (a, b). È semplicemente un alias per randrange (a, b + 1).

import random random.randrange (100) # restituisce 65 random.randrange (100) # restituisce 98 random.randrange (0, 100, 3) # restituisce 33 random.randrange (0, 100, 3) # restituisce 75 random.randint ( 1,6) # restituisce 4 random.randint (1,6) # restituisce 6

Funzioni per le sequenze

Per selezionare un elemento casuale da una data sequenza non vuota, puoi usare il scelta (ss) funzione. Con randInt (), sei limitato a una selezione di numeri da un determinato intervallo. Il scelta (ss) la funzione ti consente di scegliere un numero da qualsiasi sequenza tu voglia. 

Un altro aspetto positivo di questa funzione è che non si limita ai soli numeri. Può selezionare qualsiasi tipo di elemento in modo casuale da una sequenza. Ad esempio, il nome del vincitore di un sorteggio tra cinque diverse persone, fornito come stringa, può essere determinato utilizzando facilmente questa funzione.

Se si desidera mescolare una sequenza invece di selezionare un elemento casuale da essa, è possibile utilizzare il comando shuffle (ss) funzione. Ciò comporterà un a posto mischiare la sequenza. Per una sequenza con soli 10 (n) elementi, ci possono essere un totale di 3628800 (n!) Disposizioni differenti. Con una sequenza più grande, il numero di permutazioni possibili sarà ancora più alto, questo implica che la funzione non può mai generare tutte le permutazioni di una sequenza di grandi dimensioni.

Diciamo che devi scegliere 50 studenti da un gruppo di 100 studenti per fare un viaggio. 

A questo punto, potresti essere tentato di usare il scelta (ss) funzione. Il problema è che dovrai chiamarlo circa 50 volte nella migliore delle ipotesi in cui non sceglierà di nuovo lo stesso studente. 

Una soluzione migliore è usare il esempio (seq, k) funzione. Restituirà una lista di K elementi unici della sequenza data. La sequenza originale è rimasta invariata. Gli elementi nell'elenco risultante saranno in ordine di selezione. Se K è maggiore del numero di elementi nella sequenza stessa, verrà sollevato un errore ValueError. 

import random id = [1, 8, 10, 12, 15, 17, 25] random.choice (id) # restituisce 8 random.choice (id) # restituisce 15 nomi = ['Tom', 'Harry', 'Andrew ',' Robert '] random.choice (nomi) # restituisce Tom random.choice (nomi) # restituisce Robert random.shuffle (nomi) nomi # restituisce [' Robert ',' Andrew ',' Tom ',' Harry '] random.sample (names, 2) # returns ['Andrew', 'Robert'] random.sample (names, 2) # returns ['Tom', 'Robert'] names # returns ['Robert', 'Andrew', 'Tom', 'Harry'] 

Come potete vedere, shuffle (ss) modificato la lista originale, ma esempio (seq, k) mantenuto intatto.

Generazione di galleggianti casuali

In questa sezione verranno illustrate le funzioni che possono essere utilizzate per generare numeri casuali in base a specifiche distribuzioni di valori reali. I parametri della maggior parte di queste funzioni prendono il nome dalla variabile corrispondente nell'equazione attuale di quella distribuzione.

Quando vuoi solo un numero compreso tra 0 e 1, puoi usare il casuale() funzione. Se si desidera che il numero si trovi in ​​un intervallo specifico, è possibile utilizzare il uniforme (a, b) funzione con un e B come i limiti inferiori e superiori rispettivamente.

Diciamo che è necessario generare un numero casuale tra Basso e alto in modo tale che abbia una maggiore probabilità di trovarsi in prossimità di un altro numero modalità. Puoi farlo con il triangolare (bassa, alta, modalità) funzione. Il Basso e alto i valori saranno 0 e 1 per impostazione predefinita. Allo stesso modo, il modalità valore predefinito per il punto medio del valore basso e alto, risultante in una distribuzione simmetrica.

Ci sono molte altre funzioni per generare numeri casuali basati su diverse distribuzioni. Ad esempio, puoi usare normalvariate (mu, sigma) generare un numero casuale basato su una distribuzione normale, con mu come cattivo e sigma come deviazione standard.

import random random.random () # restituisce 0.8053547502449923 random.random () # restituisce 0.05966180559620815 random.uniform (1, 20) # restituisce 11.970525425108205 random.uniform (1, 20) # restituisce 7.731292430291898 random.triangular (1, 100, 80) # restituisce 42.328674062298816 random.triangular (1, 100, 80) # restituisce 73.54693076132074 

Probabilità ponderate

Come abbiamo appena visto, è possibile generare numeri casuali con distribuzione uniforme e distribuzione triangolare o normale. Anche in un intervallo finito come da 0 a 100, ci sono un numero infinito di float che possono essere generati. Cosa succede se c'è un insieme finito di elementi e vuoi aggiungere più peso ad alcuni valori specifici mentre selezioni un numero casuale? Questa situazione è comune nei sistemi di lotteria in cui ai numeri con poca ricompensa viene assegnata un'elevata ponderazione.

Se è accettabile che la tua applicazione abbia pesi che sono valori interi, puoi creare un elenco di elementi la cui frequenza dipende dal loro peso. È quindi possibile utilizzare il scelta (ss) funzione per selezionare casualmente un elemento da questa lista ponderata. Ecco un esempio che mostra la selezione di un importo del premio in modo casuale.

import random w_prizes = [('$ 1', 300), ('$ 2', 50), ('$ 10', 5), ('$ 100', 1)] prize_list = [premio per premio, peso in w_premi per i in range (peso)] random.choice (lista premi) # restituisce '$ 1' 

Nel mio caso, ci sono volute dieci prove per ottenere un premio di $ 2 scelto dalla lista. Le probabilità di ottenere un premio di $ 100 sarebbero molto inferiori. Allo stesso modo, puoi anche aggiungere pregiudizi ad altri programmi di questo tipo.

Pensieri finali

Questo modulo può essere utile in molte situazioni, come mescolare le domande in un compito o generare nomi utente o password casuali per i tuoi utenti utilizzando il Shuffle () funzione. Puoi anche generare numeri casuali in modo uniforme e assegnare pesi ai numeri in un intervallo specifico. Nel nostro prossimo tutorial, utilizzeremo le funzioni di questo modulo per generare dati casuali per l'analisi statistica.

Hai in mente alcune interessanti applicazioni di generatori di numeri casuali che possono essere utili agli altri lettori? Fateci sapere nei commenti.