如何轻松确定多个骰子的结果分布?


21

我想计算骰子组合总数的概率分布。

我记得,概率是组合总数与组合总数之和(假设骰子分布均匀)。

的公式是什么

  • 组合数合计
  • 合计一定数量的组合数

1
我认为您应该将和视为不同的事件。X1个=1个X2=2X1个=2X2=1个
Deep North

Answers:


15

确切的解决方案

次掷出的组合数量当然是。ñ6ñ

这些计算最容易使用一个模具的概率生成函数完成,

pX=X+X2+X3+X4+X5+X6=X1个-X61个-X

(实际上,这是pgf的倍-我会在最后处理的因子。)66

卷的pgf为。我们可以使用二项式定理直接计算出这个值(不是封闭形式,而是有用的形式):ñpXñ

pXñ=Xñ1个-X6ñ1个-X-ñ

=Xñķ=0ññķ-1个ķX6ķĴ=0-ñĴ-1个ĴXĴ

在骰子上获得等于的和的方法的数量是该乘积中的系数,我们可以将其分离为X

6ķ+Ĵ=-ññķ-ñĴ-1个ķ+Ĵ

该和是所有非负和的总和,其中;因此,它是有限的,只有项。例如,在次投掷中总计的方式数目是两个项的和,因为只能写成和:ķĴ6ķ+Ĵ=-ñ-ñ/6=14ñ=311=14-360+1161个+5

-30-311+31个-35

=1个-3-4-1311+3-3-4-75

=1个21213-3267=15

(您也可以很聪明,请注意,对于,答案通过对称1 <-> 6,2 <-> 5和3 <-> 4是相同的,并且只有一种扩展方法为 ;即且时=77-36ķ+Ĵķ=0Ĵ=4

30-34=15

因此,概率等于 =,约为14%。15/635/36

当这变得痛苦时,中心极限定理提供了很好的近似值(至少对于位于和:在相对的基础上,随着增大,它对尾部值的近似值变得越来越差。7ñ2-3ñ7n2+3ññ

我看到该公式在Wikipedia文章Srikant参考中给出,但是没有提供理由,也没有给出示例。如果这种方法看起来过于抽象,则启动您最喜欢的计算机代数系统,并要求其扩展的幂:您可以阅读全文立即设置一组值。 例如,Mathematica单线是ñx+X2++X6

With[{n=3}, CoefficientList[Expand[(x + x^2 + x^3 + x^4 + x^5 + x^6)^n], x]]

该mathematica代码可与Wolfram alpha一起使用吗?

1
这样可行。我尝试了您的早期版本,但对输出没有任何意义。

2
@Srikant:Expand [Sum [x ^ i,{i,1,6}] ^ 3]也可以在WolframAlpha中使用

1
@ A.Wilson我相信许多参考文献为归纳提供了清晰的路径,在本示例中为。如果您想要代码来计算这些东西,请参阅stats.stackexchange.com/a/116913以获取完整实现的系统。再举一个例子,Mathematica代码是(x+x2++x6)(x+x2+x3+x4)3RClear[x, d]; d[n_, x_] := Sum[x^i, {i, 1, n}]; d[6, x] d[4, x]^3 // Expand
whuber

1
请注意,@ whuber的说明适用于1d6 + 3d4,这应该可以帮助您。对于任意wdn + vdm,(x + x ^ 2 + ... + x ^ w)^ n(x + x ^ 2 + ... + x ^ v)^ m。附加项是以相同方式构造并与乘积相乘的多项式。
A.威尔逊

8

快速计算掷骰子概率分布的另一种方法是使用专门为此目的而设计的专用计算器。

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上运行。


7

让第一个骰子为红色,第二个骰子为黑色。然后有36种可能的结果:

12345611,11,21,31,41,51,623456722,12,22,32,42,52,634567833,13,23,33,43,53,645678944,14,24,34,44,54,6567891055,15,25,35,45,55,66789101166,16,26,36,46,56,6789101112

这36个()结果中的每一个均可能。red,black

当您对面孔上的数字求和(以总计)时,一些(红色,黑色)结果的总和相同-您可以在问题表中看到这一点。blue

因此,例如,只有一种方法获得总计(即仅事件()),但是有两种方法获得(即基本事件()和())。因此,总数为可能性是两倍。同样,有3种获得方式,四种获得,依此类推。11 3 21 12 3 2 4 521,132,11,23245

现在,由于您有36种可能的结果(红色,黑色),因此获取所有不同总数的方法总数也为36,因此,最后应除以36。您的总概率应该为1。


哇,桌子真漂亮!
Deep North

确实非常漂亮
Wolfies

6

在直接计算卷积的电子表格(例如excel)中,有一种非常巧妙的方法来计算组合或概率。

我将以概率的方式进行说明,并针对六面骰子进行说明,但您可以针对任意数量的面(包括添加不同的面)进行骰子处理。

(顺便说一下,在类似R或matlab的东西中也很容易进行卷积)

从几页的干净纸开始,然后从顶部向下移一排(超过6行)。

  1. 将值1放入单元格中。那就是与0骰子相关的概率。在其左侧放一个0;这就是值列-从那里继续向下,直到需要为止的1,2,3。

  2. 向右移动一列,从“ 1”向下移动一行。输入公式“ = sum(”,然后向左箭头向上箭头(以突出显示其中包含1的单元格),打“:”(开始输入范围),然后向上箭头5次,然后按“)/ 6”,然后按Enter键-这样就可以得到一个类似的公式=sum(c4:c9)/6 (此处C9是其中带有1的单元格)。

    在此处输入图片说明

    然后复制该公式并将其粘贴到其下方的5个单元格中。它们每个都应包含0.16667(ish)。

    在此处输入图片说明

    不要在这些公式所指的空白单元格中输入任何内容!

  3. 从该值的顶部向下移动1并向右移动1并粘贴...

    在此处输入图片说明

    ...总共11个值。这些将是两个骰子的概率。

    在此处输入图片说明

    如果粘贴太多,没关系,您将得到零。

  4. 对下一列重复三个骰子的步骤3,然后对四个,五个等骰子重复步骤3。

    在此处输入图片说明

    我们在这里看到在4d6 上滚动的概率为0.096451(如果乘以可以将其写为精确分数)。4 61246

如果您精通Excel,例如从一个单元格复制一个公式并将其粘贴到列中的多个单元格之类的事情,则可以在大约一分钟左右的时间内生成所有表(例如10d6)(如果这样做,则可能会更快)几次)。


如果要组合计数而不是概率,请不要除以6。

如果要使用具有不同数量面孔的骰子,可以将(而不是6个)相加,然后除以。您可以将骰子跨列混合(例如,对d6做一列,对d8做一个列,以获得d6 + d8的概率函数):ķkk

在此处输入图片说明


5

近似解

我在前面解释了确切的解决方案(请参阅下文)。我现在将提供一个可能更适合您需求的近似解决方案。

让:

小号= 1 ñXi是卷的结果的面骰子,其中。si=1,...n

ñS是所有骰子的总和。n

X¯是样本平均值。

根据定义,我们有:

X¯=iXin

换一种说法,

X¯=Sn

现在的想法是将观察的过程可视化为投掷相同骰子次而不是投掷骰子的结果。因此,我们可以调用中心极限定理(忽略与从离散分布到连续分布相关的技术),我们具有:Xinnn

X¯N(μ,σ2/n)

哪里,

μ=(s+1)/2是单个骰子掷骰的平均值,

σ2=(s21)/12是关联的方差。

以上显然是近似值,因为基础分布具有离散的支持。Xi

但,

S=nX¯

因此,我们有:

SN(nμ,nσ2)

确切的解决方案

Wikipedia简要说明了如何计算所需的概率。我将详细说明为什么那里的解释有意义。在可能的范围内,我使用了与Wikipedia文章类似的符号。

假设您有骰子,每个骰子都带有面孔,并且您想计算出所有骰子的一个掷骰总和为的概率。方法如下:nsnk

限定:

Fs,n(k):在带有面的骰子的单个骰子中总共获得概率。kns

根据定义,我们有:

Fs,1(k)=1s

sk1s

kk1k11

Fs2ķ=一世=1个一世=ķ-1个Fs1个一世Fs1个ķ-一世

ķķ-2ķ-1个2

Fs3ķ=一世=1个一世=ķ-2Fs1个一世Fs2ķ-一世

继续上面的逻辑,我们得到递归方程:

Fsñķ=一世=1个一世=ķ-ñ+1个Fs1个一世Fsñ-1个ķ-一世

有关更多详细信息,请参见Wikipedia链接。


@Srikant极好的答案,但是该函数可以解析为某种算术运算(即:不递归)吗?
罗斯

@C。罗斯不幸的是我不这么认为。但是,我怀疑只要处理相对较小的n和small s,递归就不会那么困难。您可以建立一个查询表并根据需要重复使用它。

1
您链接的Wikipedia页面具有一个简单的非递归公式,即一个总和。一个推论是胡布的答案。
道格拉斯·扎里

Wiki链接锚已死,您知道替换吗?
2014年

4

特征函数可以使涉及随机变量之和和差的计算变得非常容易。Mathematica具有处理统计分布的许多功能,包括将分布转换为其特征函数的内置函数。

我想用两个具体的例子来说明这一点:(1)假设您要确定掷出具有不同边数的骰子集合的结果,例如,掷出两个六面骰子和一个八面骰子(即,2d6 + d8)?或(2)假设您想找出两个骰子卷的区别(例如d6-d6)?

X FφXŤFφXŤ=F{F}Ť=Ë[Ë一世ŤX]

XÿFGHX+ÿHñ=FGñ==-FGñ-

我们可以使用傅立叶变换的卷积属性在特征函数方面更简单地重述一下:

φX+ÿŤXÿφXŤφÿŤ

此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]]

628=288小号={320}20=26+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

XÿFGHX-ÿHñ=FGñ==-FGñ+

我们可以使用傅立叶变换的互相关属性根据特征函数更简单地重述这一点:

φX-ÿŤXÿφXŤφÿ-Ť

因此,使用Mathematica查找d6-d6的pmf G:

G := RecoverPmf[MakeCf[6] (MakeCf[6] /. t -> -t)]

62=36小号={-55}-5=1个-66-1个=5

于:= 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}

1
当然,对于离散分布(包括有限支持的分布)(例如此处讨论的分布),cf只是在x = exp(it)处评估的概率生成函数,这使其成为编码相同信息的更为复杂的方式。
ub

2
@whuber:就像您说的那样,cf,mgf和pgf几乎相同,可以轻松地相互转换,但是Mathematica具有内置的cf,可以处理它所知道的所有概率分布,而它却没有。没有内置的pgf。这使Mathematica代码使用cfs来处理骰子的总和(和差)特别优雅,无论我希望上面演示的骰子表达的复杂性如何。另外,知道cfs,FT,卷积和互相关如何帮助解决此类问题也无济于事。

1
@Elisha:好点,所有人。我想我最想知道的是,您的十行左右的Mathematica代码是否真的比我先前建议的单行(或馈给Wolfram Alpha的Srikant短的行)更“优雅”或更有效率。我怀疑具有特征函数的内部操作比乘法多项式所需的简单卷积更加艰巨。当然,正如Glen_b的回答所表明的那样,后者在大多数其他软件环境中更容易实现。您的方法的优点是它的通用性更高。
Whuber

4

这是使用卷积手动计算两个骰子的和的概率分布的另一种方法。

为了使示例非常简单,我们将计算一个随机变量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是个隐喻,但简洁。


3

这实际上是一个令人惊讶的复杂问题。幸运的是,这里有一个确切的解决方案,在这里进行了很好的解释:

http://mathworld.wolfram.com/Dice.html

您正在寻找的概率由公式(10)给出:“在n s面骰子上获得p点(一卷p)的概率”。

在您的情况下:p =观察得分(所有骰子的总和),n =骰子数,s = 6(6面骰子)。这为您提供了以下概率质量函数:

PXñ=p=1个sñķ=0p-ñ/6-1个ķñķp-6ķ-1个ñ-1个

欢迎来到我们的网站Felix!
ub

1

喜欢用户名!做得好 :)

6×6=36

1个36223634364


我对此很困惑。我回答了一个最近的新手问题,该问题来自一个名叫die_hard的人,该人显然已经不存在了,然后我的答案附在了这个古老的话题上!
Creosote 2015年

您对stats.stackexchange.com/questions/173434/…的问题的答案已与该重复项的答案合并。
ub

1

ññ-1个

一种ñ=-6ķ-1个 和 ñ-1个ķ6ñ-1个一种ñ-1个ķ

合计中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)})

@ user67275,您的问题已合并到此问题中。但我想知道您的公式背后的想法是什么: “我使用了公式:没有办法得到8:5_H_2 = 6_C_2 = 15”
Sextus Empiricus

1

Xñ=ķXķ

X6+X5+X4+X3+X2+X1个6ñ=X1个-X661个-Xñ

ķ=22PX6=22=1066

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.