两道骰子问题(数学概率问题)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目一

题目:一个骰子,6面,1个面是1,2个面是2,3个面是3,问平均掷多少次能使1、2、3都至少出现一次。

题目:一个骰子,6面,1个面是1,2个面是2,3个面是3,问平均掷多少次能使1、2、3都至少出现一次。

解:(没学过《组合数学》的请略过)

设P(N=n)表示第n次(n>2)抛出后1,2,3都出现的概率,问题要求n的期望E(N=n).掷1的概率p=1/6,掷2的概率q=1/3,掷3的概率r=1/2.

写程序求解

#include

using namespace std;

float f(float x)

{

return (1/(1-x)/(1-x)-1-2*x);

}

int main()

{

float p=1.0/6,q=1.0/3,r=1.0/2,e;

e=r*(f(p+q)-f(p)-f(q))+p*(f(q+r)-f(q)-f(r))+q*(f(p+r)-f(p)-f(r));

cout<

return 0;

}

在Visual Studio下的运行结果为:7.3

答案7.3

题目二

假设有一个硬币,抛出字(背面)和花(正面)的概率都是0.5,而且每次抛硬币与前次结果无关。现在做一个游戏,连续地抛这个硬币,直到连续出现两次字为止,问平均要抛多少次才能结束游戏?注意,一旦连续抛出两个―字‖向上游戏就结束了,不用继续抛。

一个经典的概率问题:平均需要抛掷多少次硬币,才会首次出现连续的n 个正面?它的答案是2^(n+1) - 2 。取n=2 的话,我们就有这样的结论:平均要抛掷6 次硬币,才能得到两个连续的正面。或许这个期望次数比你想象中的要多吧。我们不妨试着来验证一下这一结果。由简单的递推可得,所有 1 都不相邻的k 位01 串有F k+2个,其中F i表示Fibonacci 数列中的第i 项。而―抛掷第k 次才出现连续两个正面‖的意思就是,k 位01 串的末三位是011 ,并且前面k - 3 位中的数字1 都不相邻。因此,在所有2^k 个k 位01 串中,只有F k-1个是满足要求的。因此,我们要求的期望值就等于∑ (k=2..∞) k * F k-1 / 2^k 。这个无穷级数就等于 6 。我怎么算的呢?我用Mathematica 算的。

显然,当n 更大的时候,期望值的计算更加复杂。而简单美妙的结论让我们不由得开始思考,这个问题有没有什么可以避免计算的巧妙思路?万万没有想到的是,在赌博问题的研究中,概率论帮了不少大忙;而这一回,该轮到赌博问题反过来立功了。

设想有这么一家赌场,赌场里只有一个游戏:猜正反。游戏规则很简单,玩家下注x 元钱,赌正面或者反面;然后庄家抛出硬币,如果玩家猜错了他就会输掉这x 元,如果玩家猜对了他将得到2x 元的回报(也就是净赚x 元)。

让我们假设每一回合开始之前,都会有一个新的玩家加入游戏,与仍然在场的玩家们一同赌博。每个玩家最初都只有 1 元钱,并且他们的策略也都是相同的:每回都把当前身上的所有钱都押在正面上。运气好的话,从加入游戏开始,庄家抛掷出来的硬币一直是正面,这个玩家就会一直赢钱;如果连续n 次硬币都是正面朝上,他将会赢得2^n 元钱。这个2^n 就是赌场老板的心理承受极限——一旦有人赢到了2^n 元钱,赌场老板便会下令停止游戏,关闭赌场。让我们来看看,在这场游戏中存在哪些有趣的结论。

首先,连续n 次正面朝上的概率虽然很小,但确实是有可能发生的,因此总有一个时候赌场将被关闭。赌场关闭之时,唯一赚到钱的人就是赌场关闭前最后进来的那n 个人。每个人都只花费了 1 元钱,但他们却赢得了不同数量的钱。其中,最后进来的人赢回了 2 元,倒数第二进来的人赢回了 4 元,倒数第n 进来的人则赢得了2^n 元(他就是赌场关闭的原因),他们一共赚取了 2 + 4 + 8 + … + 2^n = 2^(n+1) - 2 元。其余所有人初始时的1 元钱都打了水漂,因为没有人挺过了倒数第n + 1 轮游戏。

另外,由于这个游戏是一个完全公平的游戏,因此赌场的盈亏应该是平衡的。换句话说,有多少钱流出了赌场,就该有多少的钱流进赌场。既然赌场的钱最终被赢走了2^(n+1) - 2 元,因此赌场的期望收入也就是2^(n+1) - 2 元。而赌场收入的唯一来源是每人 1 元的初始赌金,这就表明游戏者的期望数量是2^(n+1) - 2 个。换句话说,游戏平均进行了2^(n+1) - 2 次。再换句话说,平均抛掷2^(n+1) - 2 次硬币才会出现n 连正的情况。

数学解法:

上面这个题目我第一次见到是在pongba的TopLanguage的一次讨论上,提出问题的人为Shuo Chen,当时我给出了一个解法,自认为已经相当简单了,先来考虑一下抛硬币的过程:首先先抛一枚硬币,如果是花,那么需要重头开始;如果是字,那么再抛一枚硬币,新抛的这枚如果也是字,则游戏结束,如果是花,那么又需要重头开始。根据这个过程,设抛硬币的期望次数为T,可以得到关系

T = 1 + 0.5T + 0.5( 1 + 0.5 * 0 + 0.5T)

解方程可得到T = 6. 由于上面这个方法只能得到期望,而无法得到方差以及具体某个事件的概率,后来我又仔细分析了一下,推出了概率生成函数为(推导的过程暂时略过,后面你会看到一个更一般、更简单的推导)

于是可以算出方差V = G''(1) + G'(1) - G'(1)^2 = 22。将G(z)根据Rational Expansion Theorem [CMath 7.3]展开,可以得到需要抛n次硬币的概率为

其中Fn是Fibonacci数列的第n项。到这里,我觉得这个问题似乎已经完全解决了,直到昨天看到Matrix67的牛B帖。在此帖中Matrix67大牛用他那神一般的数学直觉一下将需要连续抛出n个字的一般情形给解决了,而且得出的结果相当简洁:Tn = 2^(n+1) - 2,其中Tn为首次出现连续的n个字的期望投掷数。这也给了我一些启发,我试着将上面的过程进行推广,居然得到一个简单得出人意料的解法(甚至比上面n=2的推导过程还简单)。这个解法的关键在于下面这个递推关系

Tn = Tn-1 + 1 + 0.5 * Tn

也即是有 Tn = 2 * Tn-1 + 2。由于T1 = 2,因此可以得到 Tn = 2^(n+1) – 2。上面的递推关系是怎么来的呢,一个直观的理解是这样的:首先先抛掷Tn-1次,得到连续的n-1个字,然后再抛一次,若是字,则游戏结束;否则需要重头开始,也就是说又需要Tn 次。

期望投掷次数已经得出来了,但是我们还想知道方差、恰好需要投掷m 次的概率等其它一些更具体的性质。为了方便理解概率的分布情况,我先用程序生成了一个概率表如下所示。在下表中,第n行、第m列的元素为Pnm,表示首次出现连续n个字的投掷数为m的概率。

相关文档
最新文档