2016-08-01 7 views
2

範囲内の8つの乱数を生成したい場合(0からpi/8)、それらを合計してこの合計の正弦を取ってから、 N回、平均結果を取る。これをスケールアップした後、私は正しい答えを得るが、N > 10^6の場合は遅すぎる。特にN回の試行平均を行ったときn_t = 25回以上!現在、このコードを12秒のN = 10^5で実行しようとしています。これは、N = 10^7の場合、の場合は20分となりますが、それは最適ではないようです(それはわかりません!次のようにPythonを使用して多数の乱数生成を最適化する3

私のコードは次のとおりです。

import random 
import datetime 
from numpy import pi 
from numpy import sin 
import numpy 
t1 = datetime.datetime.now() 

def trial(N): 
    total = [] 
    uniform = numpy.random.uniform 
    append = total.append 
    for j in range(N): 
     sum = 0 
     for i in range (8): 
      sum+= uniform(0, pi/8) 
     append(sin(sum)) 
    return total 

N = 1000000 
n_t = 25 
total_squared = 0 
ans = [] 
for k in range (n_t): 
    total = trial(N) 
    f_mean = (numpy.sum(total))/N 
    ans.append(f_mean*((pi/8)**8)*1000000) 
sum_square = 0 
for e in ans: 
    sum_square += e**2 
sum = numpy.sum(ans) 
mean = sum/n_t 
variance = sum_square/n_t - mean**2 
s_d = variance**0.5 
print (mean, " ± ", s_d) 
t2 = datetime.datetime.now() 
print ("Execution time: %s" % (t2-t1)) 

誰も私はそれがはるかに高く評価されるだろう、これを最適化するのに役立つことができれば!

ありがとう:)

+0

最終目標は何ですか?それが単に平均を計算しているのであれば、とにかく統計的誤差を被る長いシミュレーションではなく、数学を実行します。 – Julien

+0

2億円の乱数を生成したいのですか?それは確かに時間がかかるでしょう。 – justhalf

+0

おそらく、sum = numpy.sum(numpy.random.random_sample(8))* pi_8' –

答えて

5

np.sin(np.random.uniform(0,np.pi/8,size=(8,10**6,25)).sum(axis=0)).mean(axis=0)は、この方法で結果を取得する必要がある場合、25回の試行をすばやく実行できます。これは完全にベクター化されています(簡略化して常にボーナスです)。 。

説明:

あなたはサイズ(8 x 10**6 x 25)の大きなランダム3D配列を生成します。 .sum(axis=0)は、最初の次元(8)の合計を取得します。 np.sin(...)は要素単位で適用されます。 .mean(axis=0)は残りの最初の次元(10**6)の平均を取得し、試行に対応する長さ(25)の1次元配列を残します。

+0

ありがとう!これはどのように機能し、どのように実装するのですか?申し訳ありませんが、私は一週間前にPythonを学習し始めたので、私は何をしているのか分かりません! –

+0

どういう意味ですか?コピーと貼り付けはうまくいくはずです... – Julien

+0

これはまずメモリ内のすべてを生成します。したがって、N = 1e7には少なくとも8GBが必要です。現代のコンピュータではまだOKですが、メモリの点ではそれほど安くはありません。しかし、そこのベクトル上の素晴らしいアプローチ。 +1 – justhalf

1

を中心極限定理によって、あなたの確率変数は密接に通常の法則に従います。

8つの一様変数の合計は、範囲[0、π]にわたって釣り鐘形の分布を有する。私が正しいとすれば、分布は8次のBスプラインとして表現することができます。サインをとると、範囲[0、1]の値が得られます。簡単な数値積分によって期待値μと分散σ²を求めることができます。

次に、平均μと分散σ2/ Nの正規生成器を使用します。これは瞬時に比較されます。

+2

途中で止まらない場合は、数学に向いています。) – Julien

+0

@JulienBernu:私は途中で止まっていません。私は8Nの値から計算されたものと同じ特性を持つランダム変数をどのように生成することができるのかをOPに伝えています。しかし、それはまだランダムな値です。 –

関連する問題