需求

最近帮老师制作一个点名软件,需求是这样的:

  • 1.每两个或一个人组队(除非出现总人数为奇数的情况,否则不会单人组队,也就是说最多一个单人队),作为小组研究一个课题
  • 2.每次上课让一个人讲ppt,另一个人回答问题,选择是随机的
  • 3.从下面不上台的人中选出三个来提问,选择也是随机的

预期

  • 1.必须保证上台的人不会出现在提问的三个人之中
  • 2.当所有组上台之后,应该避免出现有人没回答过问题
  • 3.一个人不应该回答过多问题

解决方案

方案一:轮数控制

实现方式

首先在全是双人组队的情况下,点名次数的数学期望应该是1.5次,即使有单人组队也应该差距不大(。。样本不会太小,毕竟至少一个班)。 轮数控制的思想就是,我先将所有人都点一遍之后再点第二遍,每次点名的时候都会检测是否进入了第二轮。根据这个简单的算法,我们应该在第二轮没有完全结束的时候,所有小组的汇报就结束了。

优点

  • 1.确实保证了每人的回答次数,每个人至少都能回答一次,也最多两次
  • 2.设计简单,每一轮中将没有点到的人放入一个集合中直接进行随机抽取即可,开始前先判断当前轮数

缺点

这个算法。。其实也不能称之为算法了,就是这个思想的弊端在于,一个人当前轮被点中之后应该是不会再被点了,这个点名软件的提神效果对其就失效了(手动滑稽)。这个弊端很严重。

方案二:抽屉原理与概率控制

实现方式v1.0

我想保证每个人的回答次数都至少为一次,根据抽屉原理,以33组为例,有66人,就会有99次点名机会,那么分配完66次点名机会保证每人一次,还有33次点名机会,这里我们就可以选择让点名两次的人不会再次被点中,于是最后的分布应该是这样的:33个人被点了一次,33个人被点了两次。
想到这里,我们是不是就可以这样设计了呢?

  • 1.所有可以被点的人都是随机抽取的
  • 2.被点了两次的无法被再次中
  • 3.当被点两次的人数达到33时,被点一次的人就无法被点中

可能存在的BUG

想想上面确实是一个不错的算法,用抽屉原理直接变成了一个简单的数学问题,而且确实达到了分布均匀并且每个人都能回答问题的要求。但是这个算法确实存在一个比较致命的bug,也是完全随机抽取带来的弊端。当最后一组存在一个人回答问题的数量为时,这个算法就直接出现了BUG,由于上台的人无法被选中,这就导致了没有人能够被点中!!虽然从概率来说,这种情况的概率不大,但是可以说是不可忽视的,因为一旦出现就会导致系统崩溃。我们应该要找到一个更完善的算法。

实现方式v2.0

于是我就想到了,可以使用概率论的方法,使得P(33人被点一次,33人被点两次) >= 0.99,这样我们就可以认为几乎可以做到均匀分布了。于是我可以这样限制:

  • 1.回答次数为0的优先级应该明显高于回答次数为1的,即P(回答0次被抽中) 远大于 P(回答1次被抽中)
  • 2.回答次数达到2的直接取消回答的可能性,即P(回答2次被抽中) = 0

设计思路:

  • 1.设抽中0次的权重 W(回答0次被抽中) = α
  • 2.设抽中1次的权重 W(回答1次被抽中) = λα
  • 3.设抽中2次的权重 W(回答2次被抽中) = 0

解释和想法

这里我就设计W(抽中1次后被抽中)是W(抽中0次后被抽中)的λ倍。根据常识我们就可以预测到,只要λ取得足够小,那最后的结果也会不断接近我们的预期,现在问题的关键是取多少。这不是一个简单的概率问题,因为随着点名次数的增加,概率是不断变化的,简单的概率计算并不能解决问题(还不是概率论学的菜。。)。但是可以肯定的是,如果我将λ取的非常小,结果是可以符合预期的。。想出这个想法的原因也是因为这样的话对于编程来说,实现思路很简单。。我现在就恨不得将λ取成一万分之一 !!

实现方式v3.0

第一个方法过于随机存在缺陷,第二个方式可以实现,但是从数学上难以证明λ的取值。因此我在想能不能换一种思路实现第二种算法,这时我就想到了最简单的二项分布(0-1分布) 。可以设一个λ范围为0-1,做99次0到1的随机取值α,小于λ就从回答0次的人中点,大于λ就从回答1次的人中点,计算α最后小于λ的次数大于66的概率,即保证最后能够所有人都被点到过。

如果最后出现第一种的极端情况,即最后那个人没回答过问题,也不会出现逻辑上的BUG。我们现在要做的就是取一个λ,使得99次点名之后,66个人都至少点过一次,我们要保证这个概率很大,至少大于等于0.99吧。。

数学问题化

回答0次被抽中的可能性为p,回答1次被抽中的概率为1-p。随机变量X表示回答0次被抽中,取值为0到99,满足二项分布 。要求随机变量X大于等于66的概率足够大。
下面由等式与不等式来表示:

  • P(回答0次被抽中) = p;
  • P(回答1次被抽中) = 1- p;
  • P(X>=66) >= 0.99;

由题意可知,我们的期望E(X)>=66,所以设P(X=k)为最大值,k的取值必定是大于66的,那P(X=0)到P(X=65)的值应该是递增的,我们可以对等式进行缩放:

P(X≥66)=1-P(X≤65)
≥1-65P(X=65)-P(X=0)
≥0.99

这里我将p=9/10代入满足概率大于0.99

因此,取λ为0.9,完成上述算法即可完成最终设计。

随便扯扯

没怎么接触过算法,就把这个问题用数学问题解决了一下,不知道各路大神有没有更牛逼的方案让我这个菜鸟学习一下。。
项目github地址

点名软件—使用二项分布实现点名均匀分布相关推荐

  1. python随机点名程序 图形化_python写一个随机点名软件,python随机点名,最近有个随机点名软件...

    python写一个随机点名软件,python随机点名,最近有个随机点名软件 最近有个随机点名软件的需求,故写了一个,上代码:github地址# -*- coding: utf-8 -*-# @Time ...

  2. python编写一个软件-python写一个随机点名软件的实例

    最近有个随机点名软件的需求,故写了一个,上代码:github地址 # -*- coding: utf-8 -*- # @Time : 18-12-31 下午4:21 # @Author : Felix ...

  3. 怎么用python制作随机点名软件_python写一个随机点名软件的实例

    最近有个随机点名软件的需求,故写了一个,上代码:github地址 # -*- coding: utf-8 -*- # @Time : 18-12-31 下午4:21 # @Author : Felix ...

  4. 小案例:利用Python写个教师常用的点名软件

    一.需求: 教师上课常用的点名软件 二.python库安装: openpyxl是Python中用于读写excel文件 tkinter是Python中GUI编程非常好用的库,而且是标准库,不需要安装,导 ...

  5. Python 编写 excel 点名软件

    闲来无事,用python写了一个点名软件,excel表格用的是微信"群签到助手"导出的表格. 已知全部人员的姓名以及一张签到表,如图 总人数                     ...

  6. python写软件实例-python写一个随机点名软件的实例

    最近有个随机点名软件的需求,故写了一个,上代码:github地址 # -*- coding: utf-8 -*- # @Time : 18-12-31 下午4:21 # @Author : Felix ...

  7. python随机点名程序 图形化,python写一个随机点名软件的实例

    最近有个随机点名软件的需求,故写了一个,上代码:github地址 # -*- coding: utf-8 -*- # @Time : 18-12-31 下午4:21 # @Author : Felix ...

  8. 点名软件(无重复)版本2

    快快快!!!看过来! 分享一款个人写的点名软件,老师上课再也不会重复点名了呦~~~ 自从第一个版本发布后,就有很多用户反馈了乱码问题,还有增加一些功能,所以小编为此做出重大更新.目前乱码问题已解决,新 ...

  9. 趣味点名软件_大学老师“花样点名”,为保证出勤率也是拼了!这回看谁还敢翘课...

    文/小佳说教育 在很多大学校园当中都流传着这样一句话:大学没有翘过课,基本就算白上.而这句话,也被很多大学生所奉行,可谓是:必修课选逃,选修课必逃. 不管是在什么时候,大学生们总会有自己的理由选择不去 ...

  10. 趣味点名软件_新老师必学之趣味点名游戏

    a 介绍玩具:老师点到一位孩子的名字,这位孩子就要给大家介绍自己带来的玩具,然后让每个孩子抱一抱. b 问候大家:老师点到一位幼儿的名字,并向幼儿问候,要求幼儿向老师.同伴.家长问好. c 介绍爱好: ...

最新文章

  1. Linux 高可用开源方案 Keepalived VS Heartbeat对比
  2. 微信小程序 全局变量异步函数_微信小程序制作简述
  3. 二分+最大化最小值 River Hopscotch POJ - 3258
  4. pytorch gather_【Pytorch】Pytorch-1.1.0 版本新特性
  5. matlab多元函数_函数的计算机处理8(1)_1MATLAB
  6. golang的Channel初始化的有缓存与无缓存解释
  7. vue使用 xterm_为什么我坚持使用xterm
  8. Vrep线程之间的切换
  9. 基于NOPI的Execl模板转换类,直接将Execl模板转换对应的Entity
  10. 解决fatal: unable to connect to github.com问题
  11. linux awk 脚本格式,偷偷学习shell脚本之awk编辑器
  12. JAVA怎么在函数内改变传入的值
  13. MySQL开启日志记录执行过的SQL语句
  14. ArrayList 源码分析(JDK1.8)
  15. 3D计算机组装,3DMax电脑组装配置
  16. 流媒体:RTMP 协议完全解析
  17. 【极客学院】-iOS学习笔记-2-Xcode(安装,创建项目,工作空间)
  18. 千万不要点开,Cjson入门快速使用看这篇就够了(CJSON入门操作以及问题讲解,CJSON对象删除出错)
  19. 英语发音规则---ea字母组合发音规律
  20. 利用正则表达式爬取豆瓣读书top250书籍信息 附有详细分析

热门文章

  1. 【单片机基础篇】共阴级四位数码管
  2. 研发进阶之项目管理(附腾讯内部满分项目管理PPT)
  3. UltraEdit,无法卸载,无法安装
  4. 什么是钉钉项目施工和工程管理系统?
  5. 拼多多API SDK【拼多多开放平台】
  6. 2021年PMP考试模拟题6(含答案解析)
  7. Kotlin教程,从入门到精通
  8. Kotlin中文教程
  9. linux是手机端还是电脑端,pc端是什么意思(pc端和移动端有什么区别)
  10. 用Java实现并查集