以下代码:
ngModel
随机生成import random
def roll(num_dice,num_faces):
return sum([random.randint(1,num_faces) for x in range(num_dice)])
num_dice
面子骰子的总和,但是对于大量骰子,它的速度很慢(num_faces
)。
在python中进行计算的更有效方法是什么?
答案 0 :(得分:0)
要在O(1)
中进行计算,请查看以下函数:
https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.multinomial.html
如果您计算
np.random.multinomial(num_dices,[1/float(num_faces)]*num_faces)
执行时间仅取决于num_faces,而不取决于num_dices
答案 1 :(得分:0)
如果使用多项式分布,则可以更快地进行计算:
import numpy as np
def roll_np(num_dice,num_faces):
return sum((np.array(range(num_faces))+1)*np.random.multinomial(num_dice,[1/float(num_faces)]*num_faces))
此实现的运行时独立于num_dice
。
我已经测试过了:
from time import time
t=time();roll_np(10000,6);print(time()-t)
34997
0.0005793571472167969
t=time();roll_np(10000,6);print(time()-t)
34938
0.0005676746368408203
t=time();roll_np(10000000,6);print(time()-t)
34996283
0.0006160736083984375
t=time();roll_np(10000000,6);print(time()-t)
34996047
0.000567913055419921