【发布时间】:2016-12-06 08:52:45
【问题描述】:
我想在一个范围内(0 到 pi/8)生成八个随机数,将它们加在一起,取这个和的正弦值,然后做 N 次,取平均结果。扩大规模后,我得到了正确答案,但对于N > 10^6 来说太慢了,尤其是当我对 N 次试验进行平均时,n_t = 25 更多次!我目前让N = 10^5 的代码在 12 秒 左右运行,这意味着 N = 10^7 需要 20 分钟,这似乎不是最佳的(可能是,我不知道!)。
我的代码如下:
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))
如果有人可以帮助我优化它,将不胜感激!
谢谢你:)
【问题讨论】:
-
最终目标是什么?如果只是计算平均值,请进行数学计算,而不是进行冗长的模拟,否则无论如何都会出现统计错误。
-
所以你想生成2 十亿个随机数?这肯定需要时间。
-
sum= numpy.sum(numpy.random.random_sample(8)) * pi_8可能会加快一点速度 -
@JulienBernu 这是一种蒙特卡罗方法,用于对 sin(x_0 + x_1 + x_2 + x_3 + x_4 + x_5 + x_6 + x_7)dx_0...dx_7 进行八维积分,范围为每个 x 从 0 到 pi/8
-
但是为什么不做分析呢?仅当分析解决方案难以处理时,使用 MC 才有意义,这里似乎并非如此......
标签: python python-3.x optimization random numbers