Box-Muller法を使用して正規分布から値を生成する小さな関数を作成していますが、負の値を取得しています。ここで Box-Mullerメソッドを使用した正規分布からの値の生成
は、私のソースコードであるimport random
def generate_normal(mu, sigma):
u = random.random()
v = random.random()
z1 = sqrt(-2 * log(u)) * sin(2 * pi * v)
z2 = sqrt(-2 * log(u)) * cos(2 * pi * v)
x1 = mu + z1 * sigma
x2 = mu + z2 * sigma
return x2
WAHTは、私が行方不明ですか?x1
とx2
の両方で負の値が表示されています。例えば:
mu: 400
sigma: 150
u: 7.27333176449e-05
v: 0.642384573173
z1: -3.40497345242
x1: -110.746017863
と:
x2: -9.79324023117
どのように私はそれを逃したのか分からない。私はちょうどその問題に焦点を当てていました、そして**非常に**有名なN(0,1) ':)のグラフィックを完全に忘れました。どうもありがとうございます! –
私たちは皆小さな逃げ道を持っています。 ;)つまり、numpy.random.normal()を使用していない理由は何ですか? –
OPは必ずNumPyを使用しているわけではありませんが、標準ライブラリはこれを 'random.gauss'(速いですがスレッドセーフではありません)または' random.normalvariate'として提供しています。つまり、与えられた方法は数値的に不安定になりがちです(単位平方でランダムな座標を選択し、重み付けされたランダムな半径とランダムな角度を選択するのではなく、単位平方の外にあればそれを拒否する方が良い)。有効な結果の半分を投げ捨てる( 'x1'は' x2'と同じくらい無作為で、独立しています;この値を覚えておいて、それを毎回返す方が良いでしょう。 –