使用python3优化大量随机数的生成

2024-03-29 10:35:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在一个范围内(0到pi/8)生成8个随机数,把它们加在一起,取这个和的正弦,在做了N次之后,取平均值。放大后,我得到了正确的答案,但对N > 10^6来说太慢了,特别是当我在N次试验中求平均值n_t = 25更多的时候!我现在让这段代码在12秒内运行N = 10^5,这意味着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))

如果有人能帮我优化这将不胜感激!你知道吗

谢谢:)


Tags: inimportnumpyfordatetimepirangeuniform
2条回答

考虑到你用这种方法获得结果的要求,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)的大型随机三维数组。.sum(axis=0)将得到第一维上的和(8)。np.sin(...)应用elementwise。.mean(axis=0)将得到第一个剩余维度(10**6)的平均值,并留给您一个1d长度数组(25),对应于您的试验。你知道吗

根据中心极限定理,你的随机变量将严格遵循一个正态定律。你知道吗

八个均匀变量之和在[0,π]范围内呈钟形分布。如果我是对的,分布可以表示为8阶B样条。取正弦可以得到一个范围为[0,1]的值。你可以通过简单的数值积分找到期望值μ和方差σ²。你知道吗

然后使用具有平均值µ和方差σ²/N的正态发生器。在比较中,这将是瞬时的。你知道吗

相关问题 更多 >