Derangement 问题

问题:

你分别写好5封信给5个朋友,你在5个信封上分别写上他们的地址,如果你把5封信随机地放进5个信封,请问所有5封信都寄错人的概率是多少?

这个问题的基数比较小,在纸上画一画可以得出答案。但正面思考可能还是会有一点麻烦,从反而思考会比较简单:只有一个人寄对,只有两个寄对,只有三个人寄对,只有四个人寄对,五个人寄对。用所有的情况减去上面那些情况即可。

只有一个人寄对:C(5,1) * 3 * 3 * 1 * 1 = 45

只有两个人寄对:C(5,2) * 2 = 20

只有三个人寄对:C(5,3) * 1 = 10

只有四个人寄对:0

五个人寄对:1

全部情况:A(5,5)

所以五个人全寄错的情况:A(5,5) - 45 - 20 - 10 -1 = 44;


如果我们把五封信,五个朋友改成 n 封信,n 个朋友,那答案是多少呢?

设为 Sn,我们第一反应,求 Sn 可以向 Sn-1 转化,里面有一个递归的思路:新增加的一个人可以与另外已全部寄错的 n-1 个人交换信,则它们还是全错的。

所以有:Sn = (n - 1) * Sn-1。如下图所示,红色表示错排的元素,白色表示刚加入,待考虑的元素:


图1 n 元素错排


你可能也会像上面给出的思路那样思考,但这是错误的!啊?为什么?如果我告诉你正确的结果是:Sn = (n - 1) * (Sn-1 + Sn-2);你可能也一时半会也不知道怎么去解释!因为实在想不出,为什么后面还要加上一个 Sn-2 !

一个简明的解释见思路1.

思路1.n 元素的错排并不一定只由 n - 1 元素的错排得到(这就是上面提到的),它还可能由一个只有一个元素排对的排列方案得到,因此此时只需要交换这个排列正确的元素与第 n 个元素的信即能得到 n 元素的错排。如下图,白色,红色意义同上,绿色表示对排的元素,


图2 正确的 n 元素错排

思路2.

或者不用上面的思路,而用正面的思路也可:

第 n 个元素有 n - 1 个位置可以放置(除去那个正确的位置);设它放置在位置 k,我们再考虑 k ,有以下情况:

1.安排 k 到 位置 n ,让其它的元素全部错排;综合前面的考虑,这些情况为 : (n - 1) * Sn-2;

2.安排 k 到非位置 n。我们这样认为:k 本来就要安排在位置 n 的,但我们的排列方案要将它不放置到位置 n,则元素 k 与其他 n - 2 个元素又构成了 n - 1 个元素的错排问题,所以情况为 : (n - 1) * Sn-1。

综合,情况为:(n - 1) * (Sn-1 + Sn-2)。

即:

Sn = (n - 1) * (Sn-1 + Sn-2)。


思路3.

容斥原理(摘自百度百科):

正整数1, 2, 3, ……, n的全排列有 n! 种,其中第k位是k的排列有 (n-1)! 种;当k分别取1, 2, 3, ……, n时,共有n*(n-1)!种排列是至少放对了一个的,由于所求的是错排的种数,所以应当减去这些排列;但是此时把同时有两个数不错排的排列多排除了一次,应补上;在补上时,把同时有三个数不错排的排列多补上了一次,应排除;……;继续这一过程,得到错排的排列种数为
S(n) = n! - n!/1! + n!/2! - n!/3! + … + (-1)^n*n!/n! = ∑(k=2~n) (-1)^k * n! / k!,
即S(n) = n! [1/0! - 1/1! + 1/2! - 1/3! + 1/4! + ... + (-1)^n/n!].
其中,∑表示连加符号,k=2~n是连加的范围;0! = 1,可以和1!相消。

感兴趣的读者可以去百度百科上面对 S(n) 的约简。http://baike.baidu.com/view/668994.htm?fr=aladdin

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值