3 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊
使用平衡的二叉搜索樹(或數(shù)組中的二叉搜索)并獲得O(log n)復(fù)雜度。每個(gè)骰子結(jié)果只有一個(gè)節(jié)點(diǎn),并且鍵是觸發(fā)該結(jié)果的間隔。
function get_result(node, seed):
if seed < node.interval.start:
return get_result(node.left_child, seed)
else if seed < node.interval.end:
// start <= seed < end
return node.result
else:
return get_result(node.right_child, seed)
該解決方案的優(yōu)點(diǎn)是實(shí)現(xiàn)起來非常簡(jiǎn)單,但是仍然具有很好的復(fù)雜性。

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
我正在考慮對(duì)您的桌子進(jìn)行細(xì)化處理。
您可以創(chuàng)建一個(gè)長(zhǎng)度為xN的整數(shù)數(shù)組,而不是使用每個(gè)模具值的累加表,其中x最好是一個(gè)較大的數(shù)字,以提高概率的準(zhǔn)確性。
使用索引(由xN歸一化)作為累積值填充此數(shù)組,并在該數(shù)組中的每個(gè)“插槽”中存儲(chǔ)該索引出現(xiàn)時(shí)將要擲出的骰子。
也許我可以舉一個(gè)例子來解釋一下:
使用三個(gè)骰子:P(1)= 0.2,P(2)= 0.5,P(3)= 0.3
創(chuàng)建一個(gè)數(shù)組,在這種情況下,我將選擇一個(gè)簡(jiǎn)單的長(zhǎng)度,例如10。(即x = 3.33333)
arr[0] = 1,
arr[1] = 1,
arr[2] = 2,
arr[3] = 2,
arr[4] = 2,
arr[5] = 2,
arr[6] = 2,
arr[7] = 3,
arr[8] = 3,
arr[9] = 3
然后要獲得概率,只需將0到10之間的數(shù)字隨機(jī)化,然后簡(jiǎn)單地訪問該索引即可。
此方法可能會(huì)降低精度,但是增加x且精度就足夠了。
添加回答
舉報(bào)