在无偏硬币翻转中,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]
答案 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
和。{ 在那些之间指定模式 界限。low
和high
界限。mode
和random.betavariate(alpha, beta)
界限 默认为零和一个。alpha > 0
参数默认为中点 在界限之间,给出一个对称的 分布。<强>
beta > 0
强>:Beta分发。参数的条件是
0
和1
。返回值介于random.expovariate(lambd)
和lambd
之间。<强>
1.0
强>:指数分布。
lambda
为0
除以所需的平均值。这应该 是非零。 (参数将是 称为“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
和标准 偏差sigma
。random.normalvariate(mu, sigma)
可以有任何 值,mu
必须大于。sigma
零<强>
random.vonmisesvariate(mu, kappa)
强>:正态分布。
mu
是平均值,0
是标准偏差。<强>
2*pi
强>:
kappa
是平均角度,表示为kappa
和0
以及2*pi
之间的弧度 是浓度参数,其中 必须大于或等于零。 如果random.paretovariate(alpha)
等于零,则为此 分布减少到统一alpha
到random.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(),您可以在保持随机性的同时拥有任何偏见的可能性。