我想在一个范围内(0 到 pi/8)生成八个随机数,将它们加在一起,取这个和的正弦,然后在这样做 N 次后,取平均结果。放大后我得到了正确的答案,但是对于 N > 10^6
来说太慢了,尤其是当我对 N 次试验 n_t = 25
进行平均时!我目前正在让这段代码在 12 秒 内运行 N = 10^5
,这意味着 20 分钟 N = 10^7
,这似乎不是最优的(可能是,我不知道!)。
我的代码如下:
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))
如果有人能帮我优化这个,我将不胜感激!
谢谢你:)
最佳答案
鉴于您要求使用此方法获得结果,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
) 对应于您的试验。
关于python - 优化使用python 3生成大量随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38696070/