una - ¿Cómo simulo un lanzamiento de moneda sesgada en python?
simulacion del lanzamiento de una moneda en java (5)
En cambio de moneda imparcial, H o T ocurre el 50% de las veces.
Pero quiero simular una moneda que da H con probabilidad ''p'' y T con probabilidad ''(1-p)''.
algo como esto:
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]
¿Desea que el "sesgo" se base en la distribución simétrica? O tal vez la distribución exponencial? Gaussian a nadie?
Bueno, aquí están todos los métodos, extraídos de la documentación al azar en sí.
Primero, un ejemplo de distribución triangular:
print random.triangular(0, 1, 0.7)
random.triangular(low, high, mode)
:Devuelve un número aleatorio de punto flotante
N
tal quelow <= N < high
y con el modo especificado entre esos límites. Los límiteslow
yhigh
defecto son cero y uno . El argumento demode
predeterminada en el punto medio entre los límites, dando una distribución simétrica.
random.betavariate(alpha, beta)
:Distribución beta Las condiciones en los parámetros son
alpha > 0
ybeta > 0
. Los valores devueltos varían entre0
y1
.
random.expovariate(lambd)
:Distribución exponencial.
lambd
es1.0
dividido por la media deseada. Debería ser distinto de cero . (El parámetro se llamaría "lambda
", pero es una palabra reservada en Python.) Los valores devueltos van de0
a infinito positivo silambd
es positivo, y de infinito negativo a0
silambd
es negativo.
random.gammavariate(alpha, beta)
:Distribución gamma (¡No la función gamma!) Las condiciones en los parámetros son
alpha > 0
ybeta > 0
.
random.gauss(mu, sigma)
:Distribución gaussiana.
mu
es la media, ysigma
es la desviación estándar. Esto es ligeramente más rápido que la función denormalvariate()
definida a continuación.
random.lognormvariate(mu, sigma)
:Registre la distribución normal. Si toma el logaritmo natural de esta distribución, obtendrá una distribución normal con media
mu
y desviación estándarsigma
.mu
puede tener cualquier valor, ysigma
debe ser mayor que cero .
random.normalvariate(mu, sigma)
:Distribución normal.
mu
es la media, ysigma
es la desviación estándar.
random.vonmisesvariate(mu, kappa)
:
mu
es el ángulo medio, expresado en radianes entre0
y2*pi
, ykappa
es el parámetro de concentración, que debe ser mayor que o igual a cero . Sikappa
es igual a cero , esta distribución se reduce a un ángulo aleatorio uniforme en el rango de0
a2*pi
.
random.paretovariate(alpha)
:Distribución de Pareto
alpha
es el parámetro de forma.
random.weibullvariate(alpha, beta)
Distribución de Weibull.
alpha
es el parámetro de escala ybeta
es el parámetro de forma.
Qué tal si:
import numpy as np
n, p = 1, .33 # n = coins flipped, p = prob of success
s = np.random.binomial(n, p, 100)
random.random()
devuelve un número de punto flotante pseudoaleatorio distribuido uniformemente en el rango [0, 1). Este número es menor que un número dado p
en el rango [0,1) con probabilidad p
. Así:
def flip(p):
return ''H'' if random.random() < p else ''T''
Algunos experimentos:
>>> 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
import random
def flip(p):
return (random.random() < p)
Eso devuelve un valor booleano que luego puede usar para elegir H o T (o elegir entre dos valores) que desee. También podría incluir la opción en el método:
def flip(p):
if random.random() < p:
return ''H''
else:
return ''T''
pero sería menos útil en general de esa manera.
Importe un número aleatorio entre 0 - 1 (puede usar la función randrange)
Si el número está arriba (1-p), devuelve las colas.
De lo contrario, devolver cabezas