31

在无偏硬币翻转中,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]
4

7 回答 7

54

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 
于 2009-01-25T06:17:59.213 回答
10

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

好吧,这是从随机文档本身中提取的所有方法。

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

print random.triangular(0, 1, 0.7)

random.triangular(low, high, mode)

返回一个随机浮点数Nlow <= N < high并且在这些边界之间具有指定的模式。和界限默认为零low和一。参数默认为边界之间的 中点,给出对称分布。highmode

random.betavariate(alpha, beta)

贝塔分布。参数的条件是alpha > 0beta > 0。返回值范围介于0和之间1

random.expovariate(lambd)

指数分布。 除以所需的平均值lambd1.0它应该是非零的。(该参数将被称为“<em> lambda”,但这是 Python 中的保留字。)返回值的范围从正无穷0到正无穷,从负无穷到负无穷 。lambd0lambd

random.gammavariate(alpha, beta)

伽马分布。(不是 gamma 函数!)参数的条件是alpha > 0beta > 0

random.gauss(mu, sigma)

高斯分布。mu是平均值,sigma是标准差。这比normalvariate()下面定义的函数略快。

random.lognormvariate(mu, sigma)

对数正态分布。如果你取这个分布的自然对数,你会得到一个带有均值mu和标准差的正态分布sigmamu可以有任何值,并且sigma必须大于

random.normalvariate(mu, sigma)

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

random.vonmisesvariate(mu, kappa)

mu是平均角度,以 和 之间的弧度表示02*pi并且kappa 是浓度参数,必须大于或等于零。如果kappa等于00 ,则此分布在 到 的范围内减少为均匀的随机角度2*pi

random.paretovariate(alpha)

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

random.weibullvariate(alpha, beta)

威布尔分布。alpha是尺度参数,beta是形状参数。

于 2009-01-25T23:24:57.367 回答
5
import random
def flip(p):
    return (random.random() < p)

这将返回一个布尔值,然后您可以使用它来选择您想要的 H 或 T(或在任何两个值之间进行选择)。您还可以在方法中包含选择:

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

但这种方式通常不太有用。

于 2009-01-25T06:14:29.970 回答
5

怎么样:

import numpy as np
n, p = 1, .33  # n = coins flipped, p = prob of success
s = np.random.binomial(n, p, 100)
于 2014-08-24T09:09:20.390 回答
2

也可以使用以下方法从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']
于 2019-09-10T20:31:11.450 回答
0
  • 导入 0 - 1 之间的随机数(可以使用 randrange 函数)

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

  • 否则,返回头

于 2009-01-25T06:17:46.810 回答
0
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() 您可以在保持随机性的同时有任何偏差的可能性。

于 2019-09-10T21:18:59.490 回答