[英]How to calculate the sum of dice rolls efficiently?
以下代碼:
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
dice的總和,但對於大量的骰子來說它很慢( O(N)
)。
在python中計算這個的更有效方法是什么?
要在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
如果使用多項分布,則可以更快地計算:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.