我需要一种算法来将游戏规则(p& p角色扮演)转换为概率,特别是使用if-then-else构建的条件构造,条件由布尔(not,and,or)和关系运算符构成(== ,> =,< =,<,>)和骰子滚动和布尔值。
示例:
var a = diceRoll(d8,d10,d12) // a shaker full of dices
// a 8 sides, a 10 sided and a 12 sided dice
// values added together
var w = true
var result = (
if (a>=20) then 10.3994
else if (a>=14 and w) then 8.23
else if (a>=8 and diceRoll(d6)>3) then 5.22
else 0
)
应该以编程方式转换为预期平均结果的公式,如
var result = diceProbabilityGreaterThan(a,20)*10.3994
+(diceProbabilityGreaterThan(a,14)-diceProbabilityGreaterThan(a,20))*8.23
+ ..
我知道如何将单个diceRoll上的单个关系运算符映射到概率(diceProbabilityGreaterThan),我知道如何手动转换这个特定的简单示例,但是我找到了任何给定的一般转换方案的问题规则。对我来说这个问题的难点在于依赖概率(比如> 20 ... a> 10)。
更多背景资料:
此问题是来自https://math.stackexchange.com/questions/842458/map-if-then-else-to-probability的克隆,因为它标记为offtopic。
答案 0 :(得分:1)
您想要的是计算函数的期望值。这可以递归完成。
我假设您在树状数据结构中有规则。然后,初始调用将是root.CalculateExpectedValue()
。
有三种节点:
CalculateExpectedValue()
应为叶节点返回此值。child.CalculateExpectedValue()
。但是,他们必须引入变量声明及其概率质量函数。必须将所有活动变量的概率质量函数作为参数传递给CalculateExpectedValue()
。有关下面概率质量函数的更多信息。p * trueChild.CalculateExpectedValue() + (1 - p) * falseChild.CalculateExpectedValue()
。此外,他们必须调整所涉及变量的概率质量函数。变量的概率质量函数定义了此变量成为特定值的可能性。对于一个简单的六面骰子,这将是1 -> 1/6, 2 -> 1/6, 3 -> 1/6 ...
。将此函数存储为字典或地图可能最简单。
对于具有多个骰子的diceRoll
函数,我们必须能够添加两个概率质量函数(例如df的pmf + d10的pmf,以及d12的pmf)。为此,我们创建了一个新的空pmf。对于两个输入分布的每对元素,我们计算结果总和(element1.Value + element2.Value
)及其概率(element1.probability * element2.probability
)。
现在我们可以为变量声明节点创建和修改PMF。我们仍然需要决策节点的行为。
首先要计算决定的概率。这很容易。选择相应变量的PMF,迭代所有条目,并在条件适用于元素时对概率求和。
对于true
子级,我们必须以这种方式修改PMF,以便删除条件为false的所有条目。对于false
孩子,我们必须删除其他条目。之后我们必须重新标准化PMF(即除以剩余概率的总和)。一定要创建新的PMF。您不希望这些修改干预树的其他部分。
您还可以将累积概率传播到叶节点。但是,这不是计算预期值所必需的。