Answers:
确切的解决方案
次掷出的组合数量当然是。
这些计算最容易使用一个模具的概率生成函数完成,
(实际上,这是pgf的倍-我会在最后处理的因子。)
卷的pgf为。我们可以使用二项式定理直接计算出这个值(不是封闭形式,而是有用的形式):
在骰子上获得等于的和的方法的数量是该乘积中的系数,我们可以将其分离为
该和是所有非负和的总和,其中;因此,它是有限的,只有项。例如,在次投掷中总计的方式数目是两个项的和,因为只能写成和:
(您也可以很聪明,请注意,对于,答案通过对称1 <-> 6,2 <-> 5和3 <-> 4是相同的,并且只有一种扩展方法为 ;即且时
因此,概率等于 =,约为14%。
当这变得痛苦时,中心极限定理提供了很好的近似值(至少对于位于和:在相对的基础上,随着增大,它对尾部值的近似值变得越来越差。
我看到该公式在Wikipedia文章Srikant参考中给出,但是没有提供理由,也没有给出示例。如果这种方法看起来过于抽象,则启动您最喜欢的计算机代数系统,并要求其扩展的幂:您可以阅读全文立即设置一组值。 例如,Mathematica单线是
With[{n=3}, CoefficientList[Expand[(x + x^2 + x^3 + x^4 + x^5 + x^6)^n], x]]
R
Clear[x, d]; d[n_, x_] := Sum[x^i, {i, 1, n}]; d[6, x] d[4, x]^3 // Expand
快速计算掷骰子概率分布的另一种方法是使用专门为此目的而设计的专用计算器。
DIKU的CS教授Torben Mogensen拥有一个出色的骰子滚轮Troll。
Troll骰子掷骰和概率计算器针对各种复杂的骰子掷骰机制打印出概率分布(pmf,直方图,以及可选的cdf或ccdf),均值,散布和均值偏差。以下是一些展示Troll骰子掷骰语言的示例:
掷出3个6面骰子,并将其相加:sum 3d6
。
掷出4个6面骰子,保留最高3个并加和:sum largest 3 4d6
。
滚动的“爆炸”六面的骰子(即,任何时候,“6”出现时,再次添加6总额为您和滚动)sum (accumulate y:=d6 while y=6)
。
如果您想了解Troll的SML 源代码是如何实现的,则可以使用它。
Morgensen教授还有29页的论文“ RPG中的骰子滚动机制”,他在其中讨论了Troll实施的许多骰子滚动机制以及其背后的一些数学原理。
Dicelab是类似的免费开源软件,可在Linux和Windows上运行。
让第一个骰子为红色,第二个骰子为黑色。然后有36种可能的结果:
这36个()结果中的每一个均可能。
当您对面孔上的数字求和(以总计)时,一些(红色,黑色)结果的总和相同-您可以在问题表中看到这一点。
因此,例如,只有一种方法获得总计(即仅事件()),但是有两种方法获得(即基本事件()和())。因此,总数为可能性是两倍。同样,有3种获得方式,四种获得,依此类推。1,1 3 2,1 1,2 3 2 4 5
现在,由于您有36种可能的结果(红色,黑色),因此获取所有不同总数的方法总数也为36,因此,最后应除以36。您的总概率应该为1。
在直接计算卷积的电子表格(例如excel)中,有一种非常巧妙的方法来计算组合或概率。
我将以概率的方式进行说明,并针对六面骰子进行说明,但您可以针对任意数量的面(包括添加不同的面)进行骰子处理。
(顺便说一下,在类似R或matlab的东西中也很容易进行卷积)
从几页的干净纸开始,然后从顶部向下移一排(超过6行)。
将值1放入单元格中。那就是与0骰子相关的概率。在其左侧放一个0;这就是值列-从那里继续向下,直到需要为止的1,2,3。
向右移动一列,从“ 1”向下移动一行。输入公式“ = sum(”,然后向左箭头向上箭头(以突出显示其中包含1的单元格),打“:”(开始输入范围),然后向上箭头5次,然后按“)/ 6”,然后按Enter键-这样就可以得到一个类似的公式=sum(c4:c9)/6
(此处C9
是其中带有1的单元格)。
然后复制该公式并将其粘贴到其下方的5个单元格中。它们每个都应包含0.16667(ish)。
不要在这些公式所指的空白单元格中输入任何内容!
从该值的顶部向下移动1并向右移动1并粘贴...
...总共11个值。这些将是两个骰子的概率。
如果粘贴太多,没关系,您将得到零。
对下一列重复三个骰子的步骤3,然后对四个,五个等骰子重复步骤3。
我们在这里看到在4d6 上滚动的概率为0.096451(如果乘以可以将其写为精确分数)。4 6
如果您精通Excel,例如从一个单元格复制一个公式并将其粘贴到列中的多个单元格之类的事情,则可以在大约一分钟左右的时间内生成所有表(例如10d6)(如果这样做,则可能会更快)几次)。
如果要组合计数而不是概率,请不要除以6。
如果要使用具有不同数量面孔的骰子,可以将(而不是6个)相加,然后除以。您可以将骰子跨列混合(例如,对d6做一列,对d8做一个列,以获得d6 + d8的概率函数):ķ
近似解
我在前面解释了确切的解决方案(请参阅下文)。我现在将提供一个可能更适合您需求的近似解决方案。
让:
小号我= 1 ,。。。ñ是卷的结果的面骰子,其中。
ñ是所有骰子的总和。
是样本平均值。
根据定义,我们有:
换一种说法,
现在的想法是将观察的过程可视化为投掷相同骰子次而不是投掷骰子的结果。因此,我们可以调用中心极限定理(忽略与从离散分布到连续分布相关的技术),我们具有:
哪里,
是单个骰子掷骰的平均值,
是关联的方差。
以上显然是近似值,因为基础分布具有离散的支持。
但,
。
因此,我们有:
。
确切的解决方案
Wikipedia简要说明了如何计算所需的概率。我将详细说明为什么那里的解释有意义。在可能的范围内,我使用了与Wikipedia文章类似的符号。
假设您有骰子,每个骰子都带有面孔,并且您想计算出所有骰子的一个掷骰总和为的概率。方法如下:
限定:
:在带有面的骰子的单个骰子中总共获得概率。
根据定义,我们有:
继续上面的逻辑,我们得到递归方程:
有关更多详细信息,请参见Wikipedia链接。
特征函数可以使涉及随机变量之和和差的计算变得非常容易。Mathematica具有处理统计分布的许多功能,包括将分布转换为其特征函数的内置函数。
我想用两个具体的例子来说明这一点:(1)假设您要确定掷出具有不同边数的骰子集合的结果,例如,掷出两个六面骰子和一个八面骰子(即,2d6 + d8)?或(2)假设您想找出两个骰子卷的区别(例如d6-d6)?
我们可以使用傅立叶变换的卷积属性在特征函数方面更简单地重述一下:
此Mathematica函数将使s面模具具有特征性的功能:
MakeCf [s_]:= 模块[{Cf}, Cf:= CharacteristicFunction [DiscreteUniformDistribution [{1,s}], t]; cf]
分布的pmf可以从其特征函数中恢复,因为傅里叶变换是可逆的。这是执行此操作的Mathematica代码:
RecoverPmf [Cf_]:= 模块[{F}, F [y _]:= SeriesCoefficient [Cf /。t-> -I * Log [x],{x,0,y}]; F]
继续我们的示例,令F为2d6 + d8产生的pmf。
F := RecoverPmf[MakeCf[6]^2 MakeCf[8]]
于:= F / @范围[3,20] 输出= {1 / 288、1 / 96、1 / 48、5 / 144、5 / 96、7 / 96、13 / 144、5 / 48、1 / 9、1 / 9,\ 5 / 48、13 / 144、7 / 96、5 / 96、5 / 144、1 / 48、1 / 96、1 / 288}
如果您想知道总计为10的结果数,请计算
于:= 6 ^ 2 8 F [10] 出= 30
我们可以使用傅立叶变换的互相关属性根据特征函数更简单地重述这一点:
因此,使用Mathematica查找d6-d6的pmf G:
G := RecoverPmf[MakeCf[6] (MakeCf[6] /. t -> -t)]
于:= G / @范围[-5,5] 输出= {1 / 36、1 / 18、1 / 12、1 / 9、5 / 36、1 / 6、5 / 36、1 / 9、1 / 12、1 / 18、1 / 36}
这是使用卷积手动计算两个骰子的和的概率分布的另一种方法。
为了使示例非常简单,我们将计算一个随机变量X的三面骰子(d3)和我们将其随机变量的两面骰子(d2)的和的概率分布。叫Y。
你要做一张桌子。在第一行中,写下X的概率分布(滚动公平d3的结果)。在左列的下方,写下Y的概率分布(滚动公平d2的结果)。
您将使用概率的左列构造概率的第一行的外部乘积。例如,右下角的单元格将是Pr [X = 3] = 1/3乘以Pr [Y = 2] = 1/2的乘积,如下图所示。在我们的简单示例中,所有像元等于1/6。
接下来,您将沿着外部乘积矩阵的斜线求和,如下图所示。每条斜线穿过一个或多个与我相同颜色的单元格:上一行穿过一个蓝色单元格,下一行穿过两个红色单元格,依此类推。
沿斜线的每个和代表所得分布中的概率。例如,红色单元格的总和等于两个骰子的总和为3的概率。这些概率显示在附图的右侧下方。
此技术可以与有限支持下的任意两个离散分布一起使用。您可以迭代地应用它。例如,如果您想知道三个六边形骰子(3d6)的分布,则可以首先计算2d6 = d6 + d6;那么3d6 = d6 + 2d6。
有一种名为J的免费(但封闭式许可)编程语言。它是一种基于数组的语言,其根源于APL。它具有内置运算符,可以沿矩阵的斜角执行外部乘积和求和,这使我演示的技术易于实现。
在下面的J代码中,我定义了两个动词。首先,动词d
构造一个表示s侧模具的pmf的数组。例如,d 6
是6面模具的pmf。其次,动词conv
找到两个数组的外积,并沿斜线求和。因此conv~ d 6
打印出2d6的pmf:
d =:$% conv =:+ //。@(* /) |:(2 + i.11),: conv〜d 6 2 0.0277778 3 0.0555556 4 0.0833333 5 0.111111 6 0.138889 7 0.166667 8 0.138889 9 0.111111 10 0.0833333 11 0.0555556 12 0.0277778
如您所见,J是个隐喻,但简洁。
这实际上是一个令人惊讶的复杂问题。幸运的是,这里有一个确切的解决方案,在这里进行了很好的解释:
http://mathworld.wolfram.com/Dice.html
您正在寻找的概率由公式(10)给出:“在n s面骰子上获得p点(一卷p)的概率”。
在您的情况下:p =观察得分(所有骰子的总和),n =骰子数,s = 6(6面骰子)。这为您提供了以下概率质量函数:
喜欢用户名!做得好 :)
合计中k的第一个极限是前面的六个数字。例如,如果您想掷骰子3掷13,那么如果您的前两个骰子掷7到12,则可以这样做。
求和的第二个极限是n-1个骰子可以滚动的极限
结果:
1 1 1 1 1 1
1 2 3 4 5 6 5 4 3 2 1
1 3 6 10 15 21 25 27 27 25 21 15 10 6 3 1
1 4 10 20 35 56 80 104 125 140 146 140 125 104 80 56 35 20 10 4 1
1 5 15 35 70 126 205 305 420 540 651 735 780 780 735 651 540 420 305 205 126 70 35 15 5 1
编辑:上面的答案是另一个问题的答案,该问题已由C.Ross合并为一个问题
下面的代码显示了如何在R中对该答案(要求5个骰子的问题)进行计算。它们类似于Glen B在答案中在Excel中执行的求和。
# recursive formula
nextdice <- function(n,a,l) {
x = 0
for (i in 1:6) {
if ((l-i >= n-1) & (l-i<=6*(n-1))) {
x = x+a[l-i-(n-2)]
}
}
return(x)
}
# generating combinations for rolling with up to 5 dices
a_1 <- rep(1,6)
a_2 <- sapply(2:12,FUN = function(x) {nextdice(2,a_1,x)})
a_3 <- sapply(3:18,FUN = function(x) {nextdice(3,a_2,x)})
a_4 <- sapply(4:24,FUN = function(x) {nextdice(4,a_3,x)})
a_5 <- sapply(5:30,FUN = function(x) {nextdice(5,a_4,x)})