在无偏硬币翻转中,H 或 T 出现 50% 的次数。
但我想模拟硬币,它给出概率为“p”的 H 和概率为“(1-p)”的 T。
像这样的东西:
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]
在无偏硬币翻转中,H 或 T 出现 50% 的次数。
但我想模拟硬币,它给出概率为“p”的 H 和概率为“(1-p)”的 T。
像这样的东西:
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]
random.random()
返回[0, 1) 范围内均匀分布的伪随机浮点数。该数字小于p
[0,1) 范围内的给定数字,概率为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
您是否希望“偏差”基于对称分布?或者可能是指数分布?高斯有人吗?
好吧,这是从随机文档本身中提取的所有方法。
首先,三角分布的一个例子:
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
。返回值范围介于0
和之间1
。
random.expovariate(lambd)
:指数分布。 除以所需的平均值
lambd
。1.0
它应该是非零的。(该参数将被称为“<em>lambda
”,但这是 Python 中的保留字。)返回值的范围从正无穷0
到正无穷,从负无穷到负无穷 。lambd
0
lambd
random.gammavariate(alpha, beta)
:伽马分布。(不是 gamma 函数!)参数的条件是
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
等于00
,则此分布在 到 的范围内减少为均匀的随机角度2*pi
。
random.paretovariate(alpha)
:帕累托分布。
alpha
是形状参数。
random.weibullvariate(alpha, beta)
威布尔分布。
alpha
是尺度参数,beta
是形状参数。
import random
def flip(p):
return (random.random() < p)
这将返回一个布尔值,然后您可以使用它来选择您想要的 H 或 T(或在任何两个值之间进行选择)。您还可以在方法中包含选择:
def flip(p):
if random.random() < p:
return 'H'
else:
return 'T'
但这种方式通常不太有用。
怎么样:
import numpy as np
n, p = 1, .33 # n = coins flipped, p = prob of success
s = np.random.binomial(n, p, 100)
也可以使用以下方法从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']
导入 0 - 1 之间的随机数(可以使用 randrange 函数)
如果数字高于 (1-p),则返回尾部。
否则,返回头
import random
def flip():
return ["H" if random.randint(0,3) <= 2 else "T" for i in range(10)]
现在正面的概率是 75%,反面的概率是 25%(0,1,2 都是正面,只有 3 是反面)。通过使用 random.randint() 您可以在保持随机性的同时有任何偏差的可能性。