簡體   English   中英

如何有效地計算骰子的總和?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM