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

StackOverflow https://stackoverflow.com/questions/477237

  •  20-08-2019
  •  | 
  •  

質問

バイアスのないコインフリップでは、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)の均一に分布した擬似ランダム浮動小数点数を返します。この数は、範囲[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 

他のヒント

<!> quot; bias <!> quot;対称分布に基づいているか?それとも指数関数的な分布ですか?ガウスの誰か?

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

まず、三角分布の例:

print random.triangular(0, 1, 0.7)
  

random.triangular(low, high, mode)

     

Nとなるようなランダムな浮動小数点数low <= N < highを返します   それらの間に指定されたモードで   境界。 lowおよびhigh境界   デフォルトは zero および one です。 mode   引数のデフォルトは中点です   境界間、対称を与える   配布。

     

random.betavariate(alpha, beta)

     

ベータ分布。パラメーターの条件はalpha > 0および   beta > 0。返される値の範囲は01です。

     

random.expovariate(lambd)

     

指数分布。 lambd1.0です   目的の平均で割った値。そうすべき   非ゼロである。 (パラメーターは   <!>#8220; lambda <!>#8221;と呼ばれますが、それは   Pythonの予約語。)返される   値の範囲はrandom.gammavariate(alpha, beta) positive   random.gauss(mu, sigma)が正の場合、無限   muの場合、負の無限大からsigmaまで   負です。

     

normalvariate()

     

ガンマ分布。 (ガンマではありません   機能!)の条件   パラメータはrandom.lognormvariate(mu, sigma)およびrandom.normalvariate(mu, sigma)です。

     

random.vonmisesvariate(mu, kappa)

     

ガウス分布。 2*piは平均で、kappaは標準です   偏差。これは少し速いです   random.paretovariate(alpha)関数より   以下で定義します。

     

alpha

     

正規分布を記録します。取ったら   これの自然対数   配布、あなたは<!>#8217;通常を取得します   平均random.weibullvariate(alpha, beta)および標準の分布   偏差beta。 <=>は任意のものを持つことができます   値、および<=>は   ゼロ

     

<=>

     

正規分布。 <=>は平均、   <=>は標準偏差です。

     

<=>

     

<=>は平均角度で、   <=>と<=>の間のラジアン、および<=>   濃度パラメータであり、   ゼロ以上でなければなりません。   <=>が zero と等しい場合、これは   分布は均一になります   <=>から<=>までの範囲にわたるランダムな角度。

     

<=>

     

パレート分布。 <=>は   形状パラメーター。

     

<=>

     

ワイブル分布。 <=>は   スケールパラメーターと<=>は形状   パラメータ。

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)
  • 0から1の間の乱数をインポートします(randrange関数を使用できます)

  • 数値が(1-p)より大きい場合、末尾を返します。

  • その他、ヘッドを返す

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top