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
Ntal quelow <= N < highy con el modo especificado entre esos límites. Los límiteslowyhighdefecto son cero y uno . El argumento demodepredeterminada 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 > 0ybeta > 0. Los valores devueltos varían entre0y1.
random.expovariate(lambd):Distribución exponencial.
lambdes1.0dividido 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 de0a infinito positivo silambdes positivo, y de infinito negativo a0silambdes negativo.
random.gammavariate(alpha, beta):Distribución gamma (¡No la función gamma!) Las condiciones en los parámetros son
alpha > 0ybeta > 0.
random.gauss(mu, sigma):Distribución gaussiana.
mues la media, ysigmaes 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
muy desviación estándarsigma.mupuede tener cualquier valor, ysigmadebe ser mayor que cero .
random.normalvariate(mu, sigma):Distribución normal.
mues la media, ysigmaes la desviación estándar.
random.vonmisesvariate(mu, kappa):
mues el ángulo medio, expresado en radianes entre0y2*pi, ykappaes el parámetro de concentración, que debe ser mayor que o igual a cero . Sikappaes igual a cero , esta distribución se reduce a un ángulo aleatorio uniforme en el rango de0a2*pi.
random.paretovariate(alpha):Distribución de Pareto
alphaes el parámetro de forma.
random.weibullvariate(alpha, beta)Distribución de Weibull.
alphaes el parámetro de escala ybetaes 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