起因

我玩 pvz2 的砸罐子的时候,非要刷新到伽刚特尔在相邻三行内的时候,才开始打。今天就来算一下这个事件的概率。

问题定义

假设草坪有五行,有若干个伽刚特尔均匀随机地出现在任意一行上,而菜问的大招能秒杀三行以内的伽刚特尔(假设它们足够近,在3*3的格子范围内),求菜问能秒杀的概率。即,僵尸出现在123行,事件发生,124行则未发生。

这里假设僵尸出现在任意一行是等概率的,即此处的 1/5。草坪行数 row = 5,菜问大招范围 m = 3 都暂且定为常数,只考虑僵尸的数量 gn 是变量。

换个场景重新定义一下问题:若干个小球均匀随机地放入 1 ~ 5 号抽屉里,只能打开编号相连的三个抽屉(即123、234、345),问能取出所有小球的概率。这里可以认为,小球放好后,你可以知道小球在哪个抽屉,并总能做出最优的打开抽屉的方案,即开123号抽屉能取出所有小球,你不会打开234号抽屉。

问题分析

gn <= 2 的情况

gn = 1,很显然 p = 1。gn = 2 时,不妨考虑其对立事件,即菜问无法秒杀的概率。因为只有两只僵尸,且它们所在行之间的距离不小于3,所以只可能是14、15、25,用排列数计算如下:
P(Aˉ)=A22∗352=625P(\bar{A}) = \frac{A_2^2*3}{5^2} = \frac{6}{25}P(Aˉ)=52A22​∗3​=256​
故,P(A)=1925P(A) = \frac{19}{25}P(A)=2519​

gn >= 3 的情况

利用分类讨论是可以做的,无论是直接求该事件,或者求对立事件都可以做。要分三只僵尸位于三行、两行、一行三种情况讨论,然后综合计算即可。在草稿纸上经过大量计算后可得,P(A3)=65125P(A_{3}) = \frac{65}{125}P(A3​)=12565​ 下标 3 表示 gn = 3。过程比较冗杂,这里不展开描述。

我介绍另一种较简单的思路:

首先选取三行只有三种情况,即选中123、234、345,不考虑行号,其实就是三个三行的情况(也就是说,不考虑行号的时候,选择123、234、345都一样)。假设僵尸全位于某一个三行内的排列数为a(如下图左1),那么2a(下图左2)就是选取123+选取234,这里会有一些重复。同理 3a 是考虑这三种情况的总合(下图左2),也有一些重复。

下面列一下每个选择具体包含的情况:

  • 123行:1 2 3 1~2 2~3 1~3 (僵尸仅位于第1行、仅位于第2行、仅位于第3行,位于12行,位于23行,位于123行)
  • 234行:2 3 4 2~3 3~4 2~4 (类似)
  • 345行:3 4 5 3~4 4~5 3~5 (类似)

那么重复的部分是哪些呢?(2 3 2~3) 、(3 4 3~4)这八种情况被计算了两次。前四种情况刚好是僵尸任意排在23行的排列数,后四种情况是僵尸任意排在34行的排列数。忽略行号,这两个排列数是相等的。

所以公式呼之欲出了,gn = 3 时的排列数 pq = 3 * 僵尸任意排列在三行内的排列数 - 2 * 僵尸任意排列在两行内的排列数

僵尸任意排列在三行内,就是 3gn3^{gn}3gn,两行内,则是 2gn2^{gn}2gn,所以

P(A3)=3∗33−2∗2353=65125P(A_3) = \frac{3 * 3^3 - 2 * 2^3}{5^3} = \frac{65}{125}P(A3​)=533∗33−2∗23​=12565​

同理可得 P(A4)=3∗34−2∗2454=211625P(A_4) = \frac{3 * 3^4 - 2 * 2^4}{5^4} = \frac{211}{625}P(A4​)=543∗34−2∗24​=625211​ 关于 gn 的公式为

P(Agn)=3∗3gn−2∗2gn5gnP(A_{gn}) = \frac{3 * 3^{gn} - 2 * 2^{gn}}{5^{gn}} P(Agn​)=5gn3∗3gn−2∗2gn​

模拟实验

还是模拟实验一下,验证一下自己的计算结果。

import numpy as npdef calc(gn=2, row=5, m=3):# np.random.seed(42)sz = 10000000samples = np.random.randint(0, row, (sz, gn)) # 随机模拟僵尸的出现情况res = samples.max(axis=1) - samples.min(axis=1) # 一次模拟中 僵尸的最大距离 < 3 则事件发生# print(samples)# print(res)print(np.sum(res < m) / sz)calc(2)
calc(3)
calc(4)print(19/25)
print(65/125)
print(211/625)

运行结果如下,可见计算的结果应该没有问题。

总结

利用了容斥原理的思想,考虑简单情况的叠加,再除去重复计算的部分,就可以得到正确的结果。

用一个菜问秒杀若干伽刚特尔的概率相关推荐

  1. 如何设计一个优秀的秒杀系统?

    前言 如果问起秒杀系统如何设计,相信都能说出个123来,但是如果细究其中的细节点,很多人估计就无法很快的打上来了.本文从六个方面,来简要讲一下秒杀系统要如何设计,应该主要哪些事情. 01 | 设计秒杀 ...

  2. 如何设计一个小而美的秒杀系统?

    https://www.ibm.com/developerworks/cn/web/wa-design-small-and-good-kill-system/index.html 现如今,春节抢红包的 ...

  3. 编写程序,从键盘输入 一个 英文字母(有若干行)。如果是大写字母,则输出它对应的小写字母;如果是小写字母,则输出它对应的大写字母。

    撰写人--软工二班--陈喜平 题目描述 编写程序,从键盘输入 一个 英文字母(有若干行).如果是大写字母,则输出它对应的小写字母:如果是小写字母,则输出它对应的大写字母. 输入 一个英文字母.(有多组 ...

  4. 【操作系统】某寺庙,住着一个老和尚和若干小和尚,有一个水缸,由小和尚提水入缸供老和尚饮用。水缸可以容纳10桶水,水取自同一口井中,由于水井口窄,每次只能容纳一个水桶取水,水桶总数为3个。每次往水缸中倒

    题目 某寺庙,住着一个老和尚和若干小和尚,有一个水缸,由小和尚提水入缸供老和尚饮用.水缸可以容纳10桶水,水取自同一口井中,由于水井口窄,每次只能容纳一个水桶取水,水桶总数为3个.每次往水缸中倒水与从 ...

  5. 一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,问该数是多少

    /* 一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,问该数是多少,(10万内求解) a*a=A+100; b*b=A+168; */#include <stdio.h& ...

  6. 记录一个菜鸡的大一立项:做一个跑步打卡APP

    记录一个菜鸡的大一立项:做一个跑步打卡APP(///▽///) 1. 思路: 2. 具体功能: [ 记录跑步时间.距离] [ 跑步计划制定] [ 跑步路程追踪] [ 跑步信息记录 ] [ 校园景点介绍 ...

  7. 我们有一个线上的项目,刚启动完就占用了超过 1.5G,一次大量 JVM Native 内存泄露的排查分析(64M 问题)

    我们有一个线上的项目,刚启动完就占用了使用 top 命令查看 RES 占用了超过 1.5G,这明显不合理,于是进行了一些分析找到了根本的原因,下面是完整的分析过程,希望对你有所帮助. 会涉及到下面这些 ...

  8. Python脚本做一个淘宝秒杀程序!

    Python脚本做一个淘宝秒杀程序! 先上代码 from selenium import webdriver import datetime import time import os import ...

  9. 因果推断会是下一个AI热潮吗?朱迪亚•珀尔新作《因果论》重磅上市!

    从"大数据时代和机器学习热潮"到"第二次因果革命",从以数据为中心到数据理解的转变不仅涉及技术上的转变,还意味着更加深刻的范式转换. 因果关系理论与现有机器学习 ...

最新文章

  1. WIN7源码安装Apache和PHP注意事项
  2. 如何用C语言编写wav读取函数,C++读取WAV音频文件的头部数据的实现方法
  3. 【Android 应用开发】 Android APK 反编译 混淆 反编译后重编译
  4. 使用NoSQL实施实体服务–第5部分:使用云提高自治性
  5. Oracle 10g、11g :RAC关闭、启动、重启步骤
  6. java 阻塞 直到完成_完成所有提交的任务后关闭Java执行程序而不会阻塞
  7. pg库sharelock_PostgreSQL 行锁解读
  8. python制作表格的语句_python根据Excel自动生成创建表sql语句
  9. Zookeeper与Kafka集群搭建
  10. 错误调试:Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4
  11. 兆比特每秒和兆字节每秒_宽带中的“M(兆)”是什么意思?
  12. Java实现面向对象编程
  13. JAVA网络编程个人笔记 第五章 URL和URI
  14. 计算机软考笔试知识点,计算机软考考试必备知识点:关键链法
  15. HTML常用语法及标签(第一天所学)
  16. 自定义 iPhone 铃声
  17. 手机剪辑视频指南:去水印、加字幕、做转场,统统一键就搞定
  18. python计算机视觉:创建缩略图
  19. 从0到1搭建数据湖Hudi环境
  20. C语言二维数组的大小的获取

热门文章

  1. 阿里P7大佬手把手教你!腾讯团队实力打造flutter入门教程,系列篇
  2. 阿里上市的造富运动,由世界上最富有的冲击引起的,马云缩水达,儿子约峰会...
  3. 葛洲坝集团电力有限责任公司召开第七次董事会
  4. 编写C语言程序,输入一个以回车符结束的字符串(少于80个字符),统计并输出其中大写辅音字母的个数(大写辅音字母是除‘A’,‘E’,‘I’,‘O’,‘U’以外的大写字母)。
  5. ssh rsa秘钥不可用
  6. Boosting算法原理(Adaboost篇)
  7. centos Cockpit
  8. 《博士学位真的那么重要吗?》读后感
  9. 安全基线、本地安全策略、账户安全----Windows应用安全
  10. kgsl ioctl