web-dev-qa-db-ja.com

Pythonでバイアスされたコインのフリップをシミュレートするにはどうすればよいですか?

偏りのないコイントスでは、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]
25
Pratik Deoghare

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 
45

「バイアス」を対称的な分布に基づいて作成しますか?または多分指数分布?ガウス誰ですか?

さて、ここにランダムなドキュメント自体から抽出されたすべてのメソッドがあります。

まず、三角分布の例:

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 > 0beta > 0です。戻り値の範囲は0から1です。

random.expovariate(lambd)

指数分布。 lambdは、1.0を目的の平均で割ったものです。 nonzeroである必要があります。 (パラメーターは「lambda」と呼ばれますが、これはPythonの予約語です。)戻り値の範囲は0からです。 lambdが正の場合は正の無限大lambdが負の場合は負の無限大から0まで。

random.gammavariate(alpha, beta)

ガンマ分布。 (ガンマ関数ではありません!)パラメーターの条件はalpha > 0beta > 0です。

random.gauss(mu, sigma)

ガウス分布。 muは平均であり、sigmaは標準偏差です。これは、以下で定義するnormalvariate()関数よりもわずかに高速です。

random.lognormvariate(mu, sigma)

正規分布を記録します。この分布の自然対数を取ると、平均muと標準偏差sigmaの正規分布が得られます。 muには任意の値を指定でき、sigmazeroより大きくする必要があります。

random.normalvariate(mu, sigma)

正規分布。 muは平均であり、sigmaは標準偏差です。

random.vonmisesvariate(mu, kappa)

muは、02*piの間のラジアンで表される平均角度であり、kappaは集中度パラメーターであり、zerokappazeroに等しい場合、この分布は0から2*piの範囲で均一なランダム角度に減少します。

random.paretovariate(alpha)

パレート分布。 alphaは形状パラメータです。

random.weibullvariate(alpha, beta)

ワイブル分布。 alphaはスケールパラメータであり、betaは形状パラメータです。

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

これによりブール値が返され、これを使用して必要なHまたはTを選択(または任意の2つの値から選択)できます。メソッドに選択肢を含めることもできます。

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

しかし、その方法では一般的にはあまり役に立ちません。

4
David Z

どうですか:

import numpy as np
n, p = 1, .33  # n = coins flipped, p = prob of success
s = np.random.binomial(n, p, 100)
4
ticktock
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
Rumi
  • 0から1までの乱数をインポートします(randrange関数を使用できます)

  • 数値が(1-p)を超える場合は、テールを返します。

  • それ以外の場合は、ヘッドを返します

0
Colin

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']
0
Sandipan Dey