3 回答
TA贡献1772条经验 获得超5个赞
使用平衡的二叉搜索树(或数组中的二叉搜索)并获得O(log n)复杂度。每个骰子结果只有一个节点,并且键是触发该结果的间隔。
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)
该解决方案的优点是实现起来非常简单,但是仍然具有很好的复杂性。
TA贡献1783条经验 获得超4个赞
我正在考虑对您的桌子进行细化处理。
您可以创建一个长度为xN的整数数组,而不是使用每个模具值的累加表,其中x最好是一个较大的数字,以提高概率的准确性。
使用索引(由xN归一化)作为累积值填充此数组,并在该数组中的每个“插槽”中存储该索引出现时将要掷出的骰子。
也许我可以举一个例子来解释一下:
使用三个骰子:P(1)= 0.2,P(2)= 0.5,P(3)= 0.3
创建一个数组,在这种情况下,我将选择一个简单的长度,例如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之间的数字随机化,然后简单地访问该索引即可。
此方法可能会降低精度,但是增加x且精度就足够了。
添加回答
举报