为了账号安全,请及时绑定邮箱和手机立即绑定

听说2019年数学高考很难?我们来用程序验证一下压轴概率大题

今年高考数学之后,网上一片哀嚎声,大家笑谈高考数学的段子数简直创造了吉尼斯纪录。我看到不少比如:

– 考完语文我哭了,等考完数学,我才知道,我哭早了
– 本来以为数学换汤不换药,谁知今年连碗都换了。
– 今年数学出卷思路,文科生当理科生,理科生当华罗庚。
– 考试中,我的三张草稿纸是擦眼泪用的

而其中被调侃最多的,是维纳斯的身高,还有一朵云这两个题。
图片描述
图片描述

当然,除此之外,还有我这篇文章要讲的全国卷一的压轴大题。这是一道概率与统计的题目。大家这么说:
– 感觉最近几年的高考数学全国一,就像是一部励志宫斗大戏,一直被看做送分题的概率题,蹬掉了立体几何,干掉了圆锥曲线,今年逆袭成功,取代导数大题成为全国一卷压轴题,成为万人敬仰的正宫娘娘
– 概率狠狠地扇了圆锥曲线和导数一巴掌,并狠狠的说道:“废物,关键时刻还得靠老子拉他们的分”.

有一种说法是,这样不按套路的题目是对认真按照套路来复习,对这些努力了很久的学生的不公平。尤其是把以前的概率送分题作为大题的做法。对此,我难以评论。毕竟,高考离我已经很久了,当时高考的题目我也早忘了。而高考的目地,它应该有怎样的区分度,考前传递的是怎样的信息和方向等,我不得而知。
那我们还是就事论事,来看看这个压轴概率题吧。
图片描述

其实这个题对于我们程序员,尤其是系统的上过概率课程的,投身于机器学习领域的同学来说,应该不难,也值得一做。这也是我比较喜欢的题型,给人的感觉它是每天工作或是实验中真实的问题,解决它是有实际意义的。我们要做的,也不是动用多高深的数学知识去灵机一动,而是踏踏实实去理解问题,去理解我们要做什么,然后一步一步的去走向结果。没有哪一步是容易卡住的。

接下来,我把这样的“一步一步走向结果”的方式进一步强化,来试着用我们程序员的武器:程序,来模拟整个实验的过程,最终验证这道题的答案。
里面说到两种药的治愈率分别为α和β,那么我们为了方便,就叫alpha和beta。
先做第(1)小问

  • P(X=-1)=P(甲药未治愈并且乙药治愈)=(1-alpha) * beta
  • P(X=0)=P(甲乙均未治愈,或者甲乙均治愈)=(1-alpha) * (1-beta) + alpha * beta
  • P(X=1)=P(甲药治愈并且乙药未治愈)=alpha * (1-beta)

这就是第(1)小问,这个第(1)小问还是送分的呀。

我们来看第(2)小问,这里一时可能并没有完全理解什么叫“甲药累计得分为i时,最终认为甲药比乙药更有效”的概率。没关系,我们直接来写程序模拟这个实验的过程,毕竟我们不是在考场里呀。
怎么来模拟呢?
他说甲药一开始是4分,那么做一次实验,甲药分数如何分布?

  • 有可能甲药得了-1分,这个概率是上面算出来的P(X=-1),题设中记为a,也就是有a的概率经过一次实验后,甲药变为3分
  • 有可能甲药得了0分,这个概率是b=P(X=0),此时甲药还是4分
  • 有可能甲药得了1分,这个概率是c=P(X=1),此时甲药变为5分

那么再做一次实验呢?甲药的分数就可能为2,3,4,5,6,并且有各自不同的概率。我们不断重复这个过程,会怎么样呢?我们来试试吧。
这里我是用的是Go语言。为什么要选用Go语言呢?因为我在慕课网开设了Go语言的课程呀!Google资深工程师深度讲解Go语言。没接触过Go语言的也没关系,大家一定看得懂。
如果排版有问题的话,可以直接点开这个链接,还可以点击上方的Run按钮直接运行哦。

package main

import "fmt"

func main()  {
  alpha := 0.5 // 题设
  beta := 0.8  // 题设

  // 第(1)小问结果
  a := (1-alpha) * beta
  b := (1-alpha) * (1 - beta) + alpha * beta
  c := alpha * (1-beta)

  // 初始状态,cur[i]记录当前轮实验中甲药得分为i的概率
  // 这里使用make开辟了一个类似其他语言的大小为9(0...8)
  // 的float64数组,虽然Go语言中这个叫切片
  // Go语言中,初始值都是0
  cur := make([]float64, 9) 
  cur[4] = 1 // 初始状态为4分,也就是一开始4分的概率是1

  printHeader()
  // 我们会逐一几率每次实验结果,一开始我们还没有做实验
  // 所以记为第0次实验的结果
  printProbs(0, cur) 

  // 做个100次试试
  for iteration := 1; iteration < 100 ;iteration++ { 
    prev := cur // prev: 上次实验结果,cur: 本次实验结果
    cur = make([]float64, 9)

    // 根据题设,0分的话,也就是乙药比甲药多治愈4只达成,实验终止
    // 但只是针对之前就得0分的那一部分终止
    cur[0] += prev[0] 
    for i := 1; i <=7; i++ {
      // 针对每一个上一轮可能的得分,我们枚举本轮实验的三种结果
      cur[i-1] += prev[i] * a
      cur[i] += prev[i] * b
      cur[i+1] += prev[i] * c
    }
    // 根据题设,8分的话,也就是甲药比乙药多治愈4只达成,实验终止
    // 但只是针对之前就得8分的那一部分终止
    cur[8] += prev[8]

    printProbs(iteration, cur) // 打印本次实验结果
  }
}

func printHeader() {
  fmt.Println("                    0       1       2       3       4       5       6       7       8")
}

func printProbs(iteration int, prob []float64) {
  fmt.Printf("Iteration %2d:", iteration)
  for i := 0; i <= 8; i++ {
    fmt.Printf(" %.5f", prob[i])
  }
  fmt.Println()
}

运行的结果如下,这里面列出了

  • 经过每轮实验后,甲药得分的分布
                    0       1       2       3       4       5       6       7       8
Iteration  0: 0.00000 0.00000 0.00000 0.00000 1.00000 0.00000 0.00000 0.00000 0.00000
Iteration  1: 0.00000 0.00000 0.00000 0.40000 0.50000 0.10000 0.00000 0.00000 0.00000
Iteration  2: 0.00000 0.00000 0.16000 0.40000 0.33000 0.10000 0.01000 0.00000 0.00000
Iteration  3: 0.00000 0.06400 0.24000 0.34800 0.24500 0.08700 0.01500 0.00100 0.00000
Iteration  4: 0.02560 0.12800 0.26560 0.29600 0.19210 0.07400 0.01660 0.00200 0.00010
Iteration  5: 0.07680 0.17024 0.26400 0.25140 0.15525 0.06285 0.01650 0.00266 0.00030
Iteration  6: 0.14490 0.19072 0.24958 0.21420 0.12790 0.05355 0.01560 0.00298 0.00057
Iteration  7: 0.22118 0.19519 0.22954 0.18322 0.10679 0.04581 0.01435 0.00305 0.00086
Iteration  8: 0.29926 0.18941 0.20758 0.15728 0.09004 0.03932 0.01297 0.00296 0.00117
Iteration  9: 0.37503 0.17774 0.18564 0.13541 0.07648 0.03385 0.01160 0.00278 0.00146
Iteration 10: 0.44612 0.16313 0.16476 0.11686 0.06532 0.02922 0.01030 0.00255 0.00174
Iteration 11: 0.51137 0.14747 0.14544 0.10104 0.05603 0.02526 0.00909 0.00230 0.00200
Iteration 12: 0.57036 0.13191 0.12788 0.08748 0.04822 0.02187 0.00799 0.00206 0.00223
Iteration 13: 0.62312 0.11711 0.11212 0.07582 0.04161 0.01895 0.00701 0.00183 0.00243
Iteration 14: 0.66997 0.10340 0.09810 0.06576 0.03597 0.01644 0.00613 0.00162 0.00262
Iteration 15: 0.71133 0.09094 0.08569 0.05708 0.03114 0.01427 0.00536 0.00142 0.00278
Iteration 16: 0.74770 0.07975 0.07477 0.04956 0.02698 0.01239 0.00467 0.00125 0.00292
Iteration 17: 0.77960 0.06978 0.06519 0.04305 0.02340 0.01076 0.00407 0.00109 0.00305
Iteration 18: 0.80752 0.06097 0.05679 0.03741 0.02031 0.00935 0.00355 0.00095 0.00315
Iteration 19: 0.83190 0.05320 0.04945 0.03251 0.01764 0.00813 0.00309 0.00083 0.00325
.....省略一些
Iteration 86: 0.99609 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 87: 0.99610 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 88: 0.99610 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 89: 0.99610 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 90: 0.99610 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 91: 0.99610 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 92: 0.99610 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 93: 0.99610 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 94: 0.99610 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 95: 0.99610 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 96: 0.99611 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 97: 0.99611 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 98: 0.99611 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389
Iteration 99: 0.99611 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00389

我们发现,做个100轮实验,也基本够了,最终得分不为0或者8的可能性都基本是0,得分0的可能性为0.99611,得分8的可能性为0.00389。说明什么呢?
在甲药一开始得分是4分的情况下,经过多轮实验,最终甲药得0分的概率是0.99611,得8分的概率是0.00389,也就是
在甲药一开始得分是4分的情况下,经过多轮实验,最终认为乙药比甲药更有效的概率是0.99611,认为甲药比乙药更有效的概率是0.00389,也就是
甲药的累计得分为4时,最终认为甲药比乙药更有效的概率是0.00389,也就是
第(2)小问的答案是0.00389
这个值很小,说明这个实验方法得出错误结论的概率很小,它的结论是可信的。

那么我们还缺一个小点没有解决,就是题设中的p[i+1]-p[i]为等比数列。我们把程序改一下,让初始值变成p[i]=1而不是p[4]=1即可验证。代码在这里,也可以点击运行。结果为:

p[0]=0.00000000
p[1]=0.00004578
p[2]=0.00022889
p[3]=0.00096132
p[4]=0.00389105
p[5]=0.01560998
p[6]=0.06248569
p[7]=0.24998856
p[8]=1.00000000
p[1]-p[0]=0.00004578
p[2]-p[1]=0.00018311
p[3]-p[2]=0.00073243
p[4]-p[3]=0.00292973
p[5]-p[4]=0.01171893
p[6]-p[5]=0.04687572
p[7]-p[6]=0.18750286
p[8]-p[7]=0.75001144

可以验证p[i+1]-p[i]的确为等比数列,公比为4。

至此,我们验证了2019高考数学全国卷一的压轴概率题。

点击查看更多内容
18人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
1.3万
获赞与收藏
487

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消