您必须多久滚动一次6面骰子才能获得每个数字至少一次?


41

我刚刚和我的孩子们一起玩过一个游戏,基本上可以归结为:谁在6面骰子获胜中至少掷出每个数字一次。

最终我赢了,其他人则在1-2回合后完成。现在我想知道:对游戏时间的期望是什么?

我知道直到您击中特定数字之前的数预期为 。n=1n16(56)n1=6

但是,我有两个问题:

  1. 您必须滚动六面骰子多少次才能获得至少每个数字一次?
  2. 在四次独立测试(即有四个玩家)中,对最大掷骰数的期望是什么?[注意:这是最大的,而不是最小的,因为在他们的年龄,这更关乎完成而不是让我的孩子们先到达那里]

我可以模拟结果,但是我不知道如何进行分析计算。


这是Matlab中的Monte Carlo模拟

mx=zeros(1000000,1);
for i=1:1000000,
   %# assume it's never going to take us >100 rolls
   r=randi(6,100,1);
   %# since R2013a, unique returns the first occurrence
   %# for earlier versions, take the minimum of x
   %# and subtract it from the total array length
   [~,x]=unique(r); 
   mx(i,1)=max(x);
end

%# make sure we haven't violated an assumption
assert(numel(x)==6)

%# find the expected value for the coupon collector problem
expectationForOneRun = mean(mx)

%# find the expected number of rolls as a maximum of four independent players
maxExpectationForFourRuns = mean( max( reshape( mx, 4, []), [], 1) )

expectationForOneRun =
   14.7014 (SEM 0.006)

maxExpectationForFourRuns =
   21.4815 (SEM 0.01)

11
优惠券收集者的问题也可以看到 -谷歌搜索将为您提供更多点击量和更多信息。也可以尝试在stats.SE上搜索。
2013年

1
@Glen_b:谢谢,我不知道那个名字!
乔纳斯(Jonas)2013年

1
@whuber:我不确定这个问题是否应该解决。他希望四次试验的预期最小击球时间。我正要为动态编程解决方案确定答案。
Neil G

2
@whuber:我将编辑我的帖子以澄清
Jonas

Answers:


22

因为需要一种“完全分析的方法”,所以这里是一个精确的解决方案。 它还提供了另一种方法来解决概率问题,即在混合替换条件下的一组黑白球中绘制一个黑球


可以将游戏中的移动次数建模为几何变量的六个独立实现的总和,概率为,每个偏移了(因为几何变量仅计算成功之前的掷骰,因此我们也必须对观察到成功的掷骰进行计数)。通过使用几何分布进行计算,我们将获得比所需答案小答案,因此必须确保最后增加。X(p)p=1,5/6,4/6,3/6,2/6,1/616 666

具有参数的这种几何变量概率生成函数(pgf)为p

f(z,p)=p1(1p)z.

因此,这六个变量之和的pgf为

g(z)=i=16f(z,i/6)=6z4(5 2z+5+10 3z+45 4z+4+5z+4+5).

(乘积可以通过部分分数分为五项来以这种封闭形式进行计算。)

累积分布函数(CDF)从的部分和(作为的幂级数)获得,该总和等于几何级数之和,并由下式给出:gz

F(z)=6z4((1) 1z+4+(5) 2z+4(10) 3z+4+(10) 4z+4(5) 5z+4+(1) 6z+4).

(我以一种表示通过包含-排除原理进行替代推导的形式编写了此表达式。)

由此,我们可以得出游戏中预期的移动次数(回答第一个问题),如下所示:

E(6+X)=6+i=1(1F(i))=14710.

的独立版本的最大值的CDF 为(从此,我们原则上可以回答有关我们喜欢的最大值的任何概率问题,例如其方差是多少,其第99个百分位数是多少, 等等)。在我们获得了mXF(z)mm=4

6+i=1(1F(i)4)21.4820363.

(该值是一个有理分数,以简化的形式具有一个71位的分母。)标准偏差为 这是四个玩家的最大值的概率质量函数的曲线图(已经偏移了):6.77108.6

数字

正如人们所期望的那样,它确实存在偏差。该模式为卷。难道最后一个完成的人会超过卷(大约)。18500.3%


该解决方案方法的发现是,几何变量的总和是具有相同参数的几何变量的混合(可能具有负权重)。 Gamma变量(具有不同的速率参数)之间也存在类似的关系。对于在Mathematica中所做的工作,我深表歉意但是我确信Matlab也可以进行这些计算:-)。
whuber

2
这就是我一直希望的答案。非常感谢你!我确实认为我应该能够在Matlab中计算数值结果:)
Jonas

f(z,p)=p1(1p)zi=16f(z,i/6)F(z)g(z)

1
f(z,p)

@MartijnWeterings谢谢您-我认为这是更准确和常规的术语。(由于长期使用生成函数的习惯,您可以说我倾向于将pmf和pgf视为同一件事。)我将在本文中更改术语。

13

{0,,6}ii6ii+16i6

i=0566i=14.7

(6,6,6,6)jiTiijpipijij。您可以通过动态编程发现命中时间和概率。这并不难,因为有遍历顺序可以填写击中时间和概率。例如,对于两个骰子:首先计算(0,0)的T和p,然后计算(1,0),然后计算(1,1),(2,0),然后计算(2,1),依此类推。

在Python中:

import numpy as np
import itertools as it
from tools.decorator import memoized  # A standard memoization decorator

SIDES = 6

@memoized
def get_t_and_p(state):
    if all(s == 0 for s in state):
        return 0, 1.0
    n = len(state)
    choices = [[s - 1, s] if s > 0 else [s]
               for s in state]
    ts = []
    ps = []
    for last_state in it.product(*choices):
        if last_state == state:
            continue
        last_t, last_p = get_t_and_p(tuple(sorted(last_state)))
        if last_p == 0.0:
            continue
        transition_p = 1.0
        stay_p = 1.0
        for ls, s in zip(last_state, state):
            if ls < s:
                transition_p *= (SIDES - ls) / SIDES
            else:
                transition_p *= ls / SIDES
            stay_p *= ls / SIDES
        if transition_p == 0.0:
            continue
        transition_time = 1 / (1 - stay_p)
        ts.append(last_t + transition_time)
        ps.append(last_p * transition_p / (1 - stay_p))
    if len(ts) == 0:
        return 0, 0.0
    t = np.average(ts, weights=ps)
    p = sum(ps)
    return t, p

print(get_t_and_p((SIDES,) * 4)[0])

1
您已经错过了游戏的四个独立位置中预期的最大掷骰数。
概率

啊,我刚刚注意到了。我认为您的意思是最低要求,但可以。
Neil G

@NeilG:我实际上是指最大值(请参阅我更新的问题),尽管我认为最小值和最大值的策略相同。您能详细说明一下动态编程策略吗?
乔纳斯(Jonas)2013年

@Jonas:已更新为最大值。我有很多工作要做,但以后也许可以为您编写代码。
Neil G

2
@NeilG:谢谢。我曾希望获得一种完全分析的方法,但是DP代码也很有指导性。
乔纳斯(Jonas)2013年

6

蒙特卡洛(Monte Carlo)快速而肮脏地估计了1位玩家的游戏时间:

N = 1e5
sample_length = function(n) { # random game length
    x = numeric(0)
    while(length(unique(x)) < n) x[length(x)+1] = sample(1:n,1)
    return(length(x))
}
game_lengths = replicate(N, sample_length(6))

μ^=14.684σ^=6.24[14.645,14.722]

为了确定四人游戏的长度,我们可以将样本分成四个部分,并取每个组的平均最小长度(您询问的是最大长度,但是我认为您是指最小长度,因为我阅读它的方式是当有人成功获取所有数字时,游戏结束):

grouped_lengths = matrix(game_lengths, ncol=4)
min_lengths = apply(grouped_lengths, 1, min)

μ^=9.44σ^=2.26[9.411,9.468]


1
我通过Matlab仿真得出了非常相似的结果,但是我很好奇如何解析地解决这个问题。另外,由于我和孩子们一起玩,所以不管谁赢了,他们都想完成比赛,所以我想问一下最大数目。
乔纳斯(Jonas)2013年

5

m

T1=6
Tm=1+6m6Tm+m6Tm1

m1

  • Tm6m6m6
  • Tm1mm6

14.7


Ti=Ti1+66i+1

1
是的,对不起,我犯了一个错误,我正在纠正它
ThePawn

希望您不要介意我添加了答案。14.7是正确的,但是递归关系仍然存在缺陷……
Neil G

没问题,第一次应该很小心:)。您的回答很好。
ThePawn

5

对第一个问题的简单直观的解释:

您首先需要滚动任何数字。这很容易,总是需要精确地滚动1卷。

5665

4664

3663

依此类推,直到我们成功完成第六卷:

66+65+64+63+62+61=14.7 rolls

该答案仅与Neil G的答案相似,但没有马尔可夫链。


1

获取下一个新数字的概率密度函数(或离散等效项)为:

f = sum(p *(1-p)^(i-1),i = 1 .. inf)

其中p是每卷的概率,当没有数字滚动时为1,在1、4 / 6 ..之后为5/6,最后一个数字为1/6

期望值mu = sum(i * p *(1-p)^(i-1),i = 1 .. inf)令n = i-1,并将p置于求和之外,

mu = p * sum((n + 1)*(1-p)^ n,n = 0 .. inf)

mu = p * sum(n(1-p)^ n,n = 0 .. inf)+ p * sum((1-p)^ n,n = 0 .. inf)mu = p *(1-p )/(1-p-1)^ 2 + p * 1 /(1-(1-p))

mu = p *(1-p)/ p ^ 2 + p / p

mu =(1-p)/ p + p / p

mu =(1-p + p)/ p

亩= 1 / p

ps的预期值(mus)的总和为1、5 / 6、4 / 6、3 / 6、2 / 6和1/6为14.7,如先前所报告的,但无论需要多少,每个所需数量的1 / p都是总的模具尺寸

同样,我们可以通过分析计算标准偏差

sigma ^ 2 = sum((i-mu)^ 2 * p *(1-p)^(i-1),i = 1 .. inf)

我将在这里为您代数,但是sigma ^ 2 =(1-p)/ p ^ 2

在6的情况下,模拟的每一步的sigma ^ 2之和为38.99,标准偏差约为6.24


-4

问题1是:

您必须掷多少个六面骰子,直到获得至少每个数字一次?

显然,正确答案必须是“无限”。


6
那将回答“确保绝对确定至少获得每个数字一次”的问题。对于提出的问题,答案是一个随机变量,其分布可以很好地近似。
Glen_b
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.