Come posso simulare il lancio di una moneta distorta in Python?
-
20-08-2019 - |
Domanda
Nel lancio della moneta imparziale H o T si verificano il 50% delle volte.
Ma voglio simulare una moneta che dia H con probabilità 'p' e T con probabilità '(1-p)'.
qualcosa del genere:
def flip(p):
'''this function return H with probability p'''
# do something
return result
>> [flip(0.8) for i in xrange(10)]
[H,H,T,H,H,H,T,H,H,H]
Soluzione
random.random()
restituisce un numero in virgola mobile pseudo-casuale distribuito uniformemente nell'intervallo [0, 1). Questo numero è inferiore a un determinato numero p
nell'intervallo [0,1) con probabilità <=>. Così:
def flip(p):
return 'H' if random.random() < p else 'T'
Alcuni esperimenti:
>>> N = 100
>>> flips = [flip(0.2) for i in xrange(N)]
>>> float(flips.count('H'))/N
0.17999999999999999 # Approximately 20% of the coins are heads
>>> N = 10000
>>> flips = [flip(0.2) for i in xrange(N)]
>>> float(flips.count('H'))/N
0.20549999999999999 # Better approximation
Altri suggerimenti
Vuoi il " bias " essere basato su una distribuzione simmetrica? O forse distribuzione esponenziale? Qualcuno gaussiano?
Bene, ecco tutti i metodi, estratti dalla stessa documentazione casuale.
Innanzitutto, un esempio di distribuzione triangolare:
print random.triangular(0, 1, 0.7)
random.triangular(low, high, mode)
:Restituisce un numero a virgola mobile casuale
N
tale chelow <= N < high
e con la modalità specificata tra quelle limiti. I limitilow
ehigh
il valore predefinito è zero e uno . Ilmode
l'argomento viene impostato automaticamente sul punto medio tra i limiti, dando una simmetria distribuzione.
random.betavariate(alpha, beta)
:Distribuzione beta. Le condizioni sui parametri sono
alpha > 0
ebeta > 0
. I valori restituiti sono compresi tra0
e1
.
random.expovariate(lambd)
:Distribuzione esponenziale.
lambd
è1.0
diviso per la media desiderata. Dovrebbe essere diverso da zero . (Il parametro sarebbe chiamato “lambda
& # 8221 ;, ma questo è un parola riservata in Python.) Restituito i valori vanno darandom.gammavariate(alpha, beta)
a positivi infinito serandom.gauss(mu, sigma)
è positivo e da infinito negativo amu
sesigma
è negativo.
normalvariate()
:Distribuzione gamma. (Non la gamma funzione!) Condizioni sul i parametri sono
random.lognormvariate(mu, sigma)
erandom.normalvariate(mu, sigma)
.
random.vonmisesvariate(mu, kappa)
:Distribuzione gaussiana.
2*pi
è la media ekappa
è lo standard deviazione. Questo è leggermente più veloce rispetto alla funzionerandom.paretovariate(alpha)
definito di seguito.
alpha
:Registra la distribuzione normale. Se prendi il logaritmo naturale di questo distribuzione, & # 8217; otterrai una normalità distribuzione con media
random.weibullvariate(alpha, beta)
e standard deviazionebeta
. <=> può avere qualsiasi valore e <=> deve essere maggiore di di zero .<=> :
Distribuzione normale. <=> è la media, e <=> è la deviazione standard.
<=> :
<=> è l'angolo medio, espresso in radianti tra <=> e <=> e <=> è il parametro di concentrazione, che deve essere maggiore o uguale a zero . Se <=> è uguale a zero , questo la distribuzione si riduce a un'uniforme angolo casuale nell'intervallo da <=> a <=>.
<=> :
Distribuzione di Pareto. <=> è il parametro shape.
<=>
Distribuzione Weibull. <=> è il parametro di scala e <=> è la forma parametro.
import random
def flip(p):
return (random.random() < p)
Questo restituisce un valore booleano che puoi quindi usare per scegliere H o T (o scegliere tra due valori qualsiasi) che desideri. Puoi anche includere la scelta nel metodo:
def flip(p):
if random.random() < p:
return 'H'
else:
return 'T'
ma sarebbe generalmente meno utile in questo modo.
Che ne dici di:
import numpy as np
n, p = 1, .33 # n = coins flipped, p = prob of success
s = np.random.binomial(n, p, 100)
-
Importa un numero casuale tra 0 - 1 (puoi usare la funzione randrange)
-
Se il numero è sopra (1-p), restituisci le code.
-
Altrimenti, testa di ritorno