在台大的概率课上做了一道有意思的概率题:

既然柏拉图这么聪明,不知道他这样做是不是已经知道自己能够以较大的概率摘得最美的玫瑰花了。当然,想归想,算出来才有说服力。这道题思考了一下,有下面几种思路:

思路1:

说是玫瑰花,其实模型是一个数字排列问题。
给出1-8 八个数字,问取到8的概率是多少。
我们这里给出确保能取到8的所有情况,然后除以8!即为概率。

首先我们要保证8不会出现在前三个数字里面,下面分情况讨论:

1:8出现在第四个位置,前三个数和后面的数随便排列,7!
2:8出现在第五个位置,再考虑前三个数最大的数分别是7的情况,6的情况,5的情况,4的情况
3:8出现在第六个位置,再考虑前三个数中最大的数分别是7的情况,6的情况,5的情况
4:8出现在第七个位置,再考虑前三个数中最大的数分别是7的情况,6的情况
5:8出现在最后一个位置,此时前面三个数最大的数只能是7.

思路2:

考虑前三个数字中的最大数字
如果前三个数字中的最大数字是8,那么柏拉图就没戏了
如果前三个数字中的最大数字是7,那么后面五个数字随便排
如果前三个数字中的最大数字是6,那么后面的五个数字中8一定要排在7前面
如果前三个数字中的最大数字是5,那么后面的五个数字中8一定要排在7和6前面,但7和6的顺序可变
后面就以此类推了

思路3:

1:8出现在第四个位置,剩下七數中隨機選出三個數字在八前面,且三數中的最大數在前三個位置之一
2:8出现在第五个位置,剩下七數中隨機選出四個數字在八前面,且四數中的最大數在前三個位置之一
3:8出现在第六个位置,剩下七數中隨機選出五個數字在八前面,且五數中的最大數在前三個位置之一
4:8出现在第七个位置,剩下七數中隨機選出六個數字在八前面,且六數中的最大數在前三個位置之一
5:8出现在最后一个位置,剩下七數中隨機選出七個數字在八前面,且七數中的最大數在前三個位置之一
以上的機率總和是答案。

Ps.1. 要做排列(分成前三個數、八以後、第四個數到八之間,這三個區塊)
Ps.2. 最大數是誰不重要

看了这些想法相信已经明白其实就是一个数字排列问题,我们的目标是要取到8,前面3个数中出现的最大数对我们实现目标是有一定的影响的。转换过后,这道题就变得简单了,算出来保留2位小数概率为0.41。

好了,上面是个特殊的问题,现在该抛出一个一般的问题了:

我们来换一个思路,
若有n朵花,用1,2,3...n表示,数字越大越美丽
若用前m朵做参考,那取到n的概率P是多少?

假设n出现在m前,肯定没戏了,
考虑n出现在m+p+1位置,这样要求, 前m个数字的最大值,比m+1到m+p 这p个数的最大值大,就可以取到n了
所以前m个数的最大值,一定也是前m+p个数的最大值
也就是说,有m+p 个不同的数,最大值落在前m个概率的是多少?

我想,解决了这个问题,无论花园里面有几朵玫瑰花,前面看几朵作为参考我们都不害怕了。

现在说说这种思路的解法:

首先p是有范围的,因为n出现在n+1-n这个区间,p的取值为0到n-m-1

考虑前m+p个数字的情况,我们是从n-1个数中抽取出m+p个数,共C(m+p,n-1)种

再考虑其中最大的数字放在前m个位置的个数,C(1,m)

前面剩下的m+p-1个数任意排列即可,(m+p-1)!种

撇除掉n和前面m+p个数,后面的n-m-p-1任意排列,(n-m-p-1)!种

好了,加上上面p的取值,和全排列的个数 n!,我们就得到了概率的一般公式:

如果不信把n=8, m=3带进去试试。

好了,现在连一般的通项公式都弄出来了。

不过还没有结束,心中仍存在一个疑问,为什么柏拉图在这里知道选择先查看3朵而后采到最美玫瑰花的概率最大,一个原因是他把这里的几种情况都算了一遍,另外一种原因可以通过数学证明当m和n存在某种关系时概率最大。

为了计算,我们可以对上面的一般式进行化简,结果发现概率大小和下面这个式子的大小密切相关

现在可以编程来看看给定n时m取什么情况式子值最大,这里n取值为2到50:

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;int main()
{int n,m,i;int maxm;double sum;double max;for(n=2;n<=50;n++){max=0;printf("n= %d   ",n);for(m=1;m<n;m++){sum=0;for(i=0;i<=n-m-1;i++){sum+=(double)1/(m+i);}sum=sum*m;if(sum>max){max=sum;maxm=m;}}printf("max m = %d\n",maxm);}//scanf("%d",&n);return 0;
}

输出结果:

n= 2   max m = 1
n= 3   max m = 1
n= 4   max m = 1
n= 5   max m = 2
n= 6   max m = 2
n= 7   max m = 2
n= 8   max m = 3
n= 9   max m = 3
n= 10   max m = 3
n= 11   max m = 4
n= 12   max m = 4
n= 13   max m = 5
n= 14   max m = 5
n= 15   max m = 5
n= 16   max m = 6
n= 17   max m = 6
n= 18   max m = 6
n= 19   max m = 7
n= 20   max m = 7
n= 21   max m = 8
n= 22   max m = 8
n= 23   max m = 8
n= 24   max m = 9
n= 25   max m = 9
n= 26   max m = 9
n= 27   max m = 10
n= 28   max m = 10
n= 29   max m = 10
n= 30   max m = 11
n= 31   max m = 11
n= 32   max m = 12
n= 33   max m = 12
n= 34   max m = 12
n= 35   max m = 13
n= 36   max m = 13
n= 37   max m = 13
n= 38   max m = 14
n= 39   max m = 14
n= 40   max m = 15
n= 41   max m = 15
n= 42   max m = 15
n= 43   max m = 16
n= 44   max m = 16
n= 45   max m = 16
n= 46   max m = 17
n= 47   max m = 17
n= 48   max m = 17
n= 49   max m = 18
n= 50   max m = 18

这里可以看到n=8时m=3确实概率最大,柏拉图没错。

现在该考虑m和n的关系如何用数学来求解了,毕竟写代码只能解决有限范围的问题,数学推导才能解决无限范围的问题。

考虑到当n很大时,有下面这个关系存在:

这就是传说中的调和序列求和。于是我们就可以把式子简化为:

这里要补充说明下,我们说了n很大,没有说m也很大,ln(m)放在这里有些欠妥,如果能给出证明自然是好的,无奈这里我不会证,不过我认为误差应该在我们可以接受的范围内。

有人给出证明:

令f(m)=m*[1/m+1/(m+1)+...1/(m+n-m-1)]
f(m+1)-f(m)=1/(m+1)+...+1/(n-1)-1=s(n-1)-s(m)-1

m满足s(n-1)-s(m)=1取最大,其中s(n)是调和级数的前n和,所以m也是很大的

下面对这个式子求导,令导数为0,就能得到一个很简单的结论:

其实应该写成这样较为合适:

这就是在n取值较大时m与n的关系。

如果不信,可以写程序验证下,对上面的代码改动一下即可,n值要取大一点:

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;int main()
{int n,m,i;int maxm;double sum;double max;for(n=2;n<=1000;n++){max=0;printf("n= %d   ",n);for(m=1;m<n;m++){sum=0;for(i=0;i<=n-m-1;i++){sum+=(double)1/(m+i);}sum=sum*m;if(sum>max){max=sum;maxm=m;}}printf("max m = %d *******n/m= %lf\n",maxm,(double)n/maxm);}//scanf("%d",&n);return 0;
}

结果为:

可以看到,n取900多时,n/m的比值和 e(2.71828182846)确实比较接近,之所以有偏差,估计一方面是在对公式化简的时候产生的,另一方面是因为m必须取整数而产生的。大体说来,结果还是令我满意的。

小结:在这里我展示了从柏拉图采花的一个特殊问题衍生到一个一般问题并求解的过程。在求解一般问题时,我先用数学知识来求出公式,然后使用了程序来验证猜想,再用数学知识来求解,最后用程序来验证我的结论,得到了一个较为满意的结果。我想这就是人们常说的举一反三的过程,拿到一个题目可以对其进行深入挖掘,做一道题会一类题,那绝对是一件极有意义,事半功倍的事。

从柏拉图采花问题说起相关推荐

  1. BZOJ2743 [HEOI2012]采花 【离线 + 树状数组】

    题目 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采 ...

  2. P4113 [HEOI2012]采花

    题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...

  3. 洛谷 P2056 采花

    题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成 ...

  4. 1619. [HEOI2012]采花

    1619. [HEOI2012]采花 ★★☆   输入文件:1flower.in   输出文件:1flower.out   简单对比 时间限制:5 s   内存限制:128 MB [题目描述] 萧薰儿 ...

  5. P4113 [HEOI2012]采花 ( 树状数组 + 离线 )

    题目链接:点击进入 题目 思路 跟此题相似:HH的项链 对于若干个询问的区间 [ l , r ] ,如果他们的 r 都相等的话,那么对于数组中出现的同一个数字,因为要求只有每个数出现至少两次才可以计入 ...

  6. luogu P2056 采花

    题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成 ...

  7. 洛谷P4113 [HEOI2012]采花 题解

    洛谷P4113 [HEOI2012]采花 题解 题目链接:P4113 [HEOI2012]采花 题意:萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园 ...

  8. [HEOI2012]采花

    题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...

  9. 【河北OI 2012 DAY1】采花 线段树

    [河北OI 2012 DAY1]NKOJ2182 采花 问题描述 萧芸斓是Z 国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳 了n 朵花 ...

最新文章

  1. MySQL长途售票系统_PHP+MySQL长途客用汽车票订票系统的设计与实现
  2. 2020中国人工智能年度评选报名即将截止!4大类别7大奖项开放申请
  3. EOS账户系统(6)权限和Action映射
  4. android 开源组件合集-UI篇(2013-11-07更新)
  5. JavaScript学习笔记(一)—— 数据类型
  6. NET开发人员应该要知道
  7. ESTORE OPENCART 清爽现代主题模板 ABC-0063
  8. 冒泡排序 C语言(从大到小排序)
  9. CCS6图文安装教程
  10. Feature Statistics Mixing Regularization for Generative Adversarial Networks
  11. matlab中pid参数整定,基于MATLAB/Simulink的PID参数整定
  12. LOJ10068 秘密的牛奶运输
  13. 微软人工智能公开课.md
  14. vb 获取系统声音的电平_音响系统速成方法学习资料
  15. windows ESP分区丢失处理方案与磁盘分区注意事项
  16. iOS游戏《胖鸟大冒险》上架app store+感想
  17. java毕业设计大学生心理咨询管理系统mybatis+源码+调试部署+系统+数据库+lw
  18. access sql 取余_国家计算机二级ACCESS函数总结
  19. 投屏镜像工具玩手机游戏的优势
  20. 【选型指南】数字源表/源测量单元/SMU选型的7个重要指标

热门文章

  1. 风投掘金可穿戴设备:大数据才是背后真金
  2. 开Lotus notes后,单击“邮件”,打不开邮箱,弹出“远程服务器不是已知的TCP/IP”报错
  3. 北邮网研院宿舍_北邮研究生宿舍条件(北邮研究生宿舍图片)
  4. 高效的六面体变换算法实现(一) —— 等圆柱映射 与 六面体映射(MarkDown编辑器版)
  5. 电控系统开发工作内容梳理
  6. 首个高温红色预警来了,气象预警你了解多少?
  7. Github中如何给项目创建GitHub Pages官方网页
  8. ES6~11:全部内容(2w+字)推荐全文复制到md文档,或者word文档
  9. linux cpufreq framework(3)_cpufreq core
  10. 动态脑电图(Ambulatory EEG)及其工作过程、数据处理!