如何有效地计算骰子总和?

时间:2019-04-06 06:59:51

标签: python algorithm math

以下代码:

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中进行计算的更有效方法是什么?

2 个答案:

答案 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