偏りのないコイントスでは、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]
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)
:
low <= N < high
であり、それらの境界の間に指定されたモードがあるようなランダムな浮動小数点数N
を返します。low
およびhigh
の境界は、デフォルトでzeroおよびoneになります。mode
引数はデフォルトで境界間の中間点になり、対称的な分布になります。
random.betavariate(alpha, beta)
:ベータ分布。パラメータの条件は
alpha > 0
とbeta > 0
です。戻り値の範囲は0
から1
です。
random.expovariate(lambd)
:指数分布。
lambd
は、1.0
を目的の平均で割ったものです。 nonzeroである必要があります。 (パラメーターは「lambda
」と呼ばれますが、これはPythonの予約語です。)戻り値の範囲は0
からです。lambd
が正の場合は正の無限大、lambd
が負の場合は負の無限大から0
まで。
random.gammavariate(alpha, beta)
:ガンマ分布。 (ガンマ関数ではありません!)パラメーターの条件は
alpha > 0
とbeta > 0
です。
random.gauss(mu, sigma)
:ガウス分布。
mu
は平均であり、sigma
は標準偏差です。これは、以下で定義するnormalvariate()
関数よりもわずかに高速です。
random.lognormvariate(mu, sigma)
:正規分布を記録します。この分布の自然対数を取ると、平均
mu
と標準偏差sigma
の正規分布が得られます。mu
には任意の値を指定でき、sigma
はzeroより大きくする必要があります。
random.normalvariate(mu, sigma)
:正規分布。
mu
は平均であり、sigma
は標準偏差です。
random.vonmisesvariate(mu, kappa)
:
mu
は、0
と2*pi
の間のラジアンで表される平均角度であり、kappa
は集中度パラメーターであり、zero。kappa
がzeroに等しい場合、この分布は0
から2*pi
の範囲で均一なランダム角度に減少します。
random.paretovariate(alpha)
:パレート分布。
alpha
は形状パラメータです。
random.weibullvariate(alpha, beta)
ワイブル分布。
alpha
はスケールパラメータであり、beta
は形状パラメータです。
import random
def flip(p):
return (random.random() < p)
これによりブール値が返され、これを使用して必要なHまたはTを選択(または任意の2つの値から選択)できます。メソッドに選択肢を含めることもできます。
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)
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()を使用することにより、ランダム性を維持しながら、バイアスの可能性を持たせることができます。
0から1までの乱数をインポートします(randrange関数を使用できます)
数値が(1-p)を超える場合は、テールを返します。
それ以外の場合は、ヘッドを返します
nsamples
を使用してX ~ Bernoulli(p)
分布から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']