如何在python中模拟偏置硬币的翻转?

时间:2009-01-25 06:13:00

标签: python random coin-flipping

在无偏硬币翻转中,H或T出现50%的次数。

但是我想模拟硬币给出H概率'p'和T概率'(1-p)'。

类似的东西:

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]

7 个答案:

答案 0 :(得分:45)

random.random()返回范围为[0,1]的均匀分布的伪随机浮点数。此数字小于[0,1]范围内的给定数字p,概率为p。因此:

def flip(p):
    return 'H' if random.random() < p else 'T'

一些实验:

>>> 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 

答案 1 :(得分:8)

您是否希望“偏见”基于对称分布?或者也许是指数分布?高斯有人吗?

嗯,以下是从随机文档中提取的所有方法。

首先,三角分布的一个例子:

print random.triangular(0, 1, 0.7)
  

<强> random.triangular(low, high, mode)

     

返回一个随机浮点数N,使low <= N < high和。{   在那些之间指定模式   界限。 lowhigh界限。moderandom.betavariate(alpha, beta)界限   默认为一个alpha > 0   参数默认为中点   在界限之间,给出一个对称的   分布。

     

<强> beta > 0

     

Beta分发。参数的条件是0和   1。返回值介于random.expovariate(lambd)lambd之间。

     

<强> 1.0

     

指数分布。 lambda0   除以所需的平均值。这应该   是非零。 (参数将是   称为“ lambd ”,但这是一个   Python中的保留字。)返回   值范围从0正数   无穷大如果lambd是积极的,那么   如果random.gammavariate(alpha, beta),则从负无穷alpha > 0   是否定的。

     

<强> beta > 0

     

伽玛分布。 (不是伽玛   功能!)条件   参数为random.gauss(mu, sigma)mu

     

<强> sigma

     

高斯分布。 normalvariate()是平均值,random.lognormvariate(mu, sigma)是标准   偏差。这稍快一点   而不是mu函数   定义如下。

     

<强> sigma

     

记录正态分布。如果你采取   这个的自然对数   分配,你会得到正常的   分布均值mu和标准   偏差sigmarandom.normalvariate(mu, sigma)可以有任何   值,mu必须大于。sigma   

     

<强> random.vonmisesvariate(mu, kappa)

     

正态分布。 mu是平均值,   0是标准偏差。

     

<强> 2*pi

     

kappa是平均角度,表示为   kappa0以及2*pi之间的弧度   是浓度参数,其中   必须大于或等于。   如果random.paretovariate(alpha)等于,则为此   分布减少到统一   alpharandom.weibullvariate(alpha, beta)范围内的随机角度。

     

<强> alpha

     

帕累托分布。 beta是   形状参数。

     

<强> {{1}}

     

威布尔分布。 {{1}}是   scale参数和{{1}}是形状   参数。

答案 2 :(得分:4)

import random
def flip(p):
    return (random.random() < p)

返回一个布尔值,然后您可以使用它来选择所需的H或T(或在任意两个值之间选择)。您还可以在方法中包含选项:

def flip(p):
    if random.random() < p:
        return 'H'
    else:
        return 'T'

但这种方式通常不那么有用。

答案 3 :(得分:4)

怎么样:

import numpy as np
n, p = 1, .33  # n = coins flipped, p = prob of success
s = np.random.binomial(n, p, 100)

答案 4 :(得分:0)

  • 导入0到1之间的随机数(您可以使用randrange函数)

  • 如果数字高于(1-p),则返回尾部。

  • 否则,回头

答案 5 :(得分:0)

一个人也可以使用X ~ Bernoulli(p)nsamples个分布sympy进行采样:

from sympy.stats import Bernoulli, sample_iter
list(sample_iter(Bernoulli('X', 0.8), numsamples=10)) # p = 0.8 and nsamples=10
# [1, 1, 0, 1, 1, 0, 1, 1, 1, 1]

返回'H''T'代替

def flip(p, n):
    return list(map(lambda x: 'H' if x==1 else 'T', sample_iter(Bernoulli('X', p), numsamples=n)))

print(flip(0.8, 10)) # p = 0.8 and nsamples=10
# ['H', 'H', 'T', 'H', 'H', 'T', 'H', 'H', 'H', 'H']

答案 6 :(得分:0)

import random
def flip():
    return ["H" if random.randint(0,3) <= 2 else "T" for i in range(10)]

现在,Head的机率是75%,tail的机率是25%(0,1,2都是Heads,只有3个是Tails)。通过使用random.randint(),您可以在保持随机性的同时拥有任何偏见的可能性。