热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

拜托,面试别再问我抢红包概率了!!!

一个拼手气红包,N个人抢,如何快速实现?

:发时计算,抢时分配:

(1)发红包的时候,一次计算,提前分好;

(2)抢的时候,一个一个领走;

此时,每个人抢到大包和小包的概率是相同的,整体具备公平性。

 

有没有可能,抢一次计算一次,抢一次计算一次?

:不太可能。

如果抢一次计算一次,第一个人抓一把,第二个人将剩下的抓一把,总体来说,后抢的人不公平。

 

如何实施计算呢?

:切面条法。

一根面条,随机分成5根,闭上眼睛剁4刀就行了。用计算机来实现,就是在(0,1)内随机4个不相同的值。

 

切面条法存在什么问题?

:随机分,可能导致贫富差距过大。

例如,假设红包总金额是1,那么领得最多的人可以得到0.38元,而最少的可能只有0.03元,要差10倍之多。

画外音:注意,这是单次贫富差距。

 

能否增加一个杠杆,调节红包间差距?

:狄利克雷分布。

在众多随机变量分布中,狄利克雷分布非常符合我们的场景,它有一个 α 控制参数:

(1)α=1时,即上文的切面条法;

(2)α 逐步增大,切出来的面条越均匀;

 

除了一次性的抢红包,红包接力玩法呢?


什么是红包接力玩法?

:红包接力的规则是,群里先由一人发红包,群内的人抢,“手气最佳”的那个人继续发新一轮的红包,不断往复循环。

 

如果一直这么玩下去,会有什么结果呢?

“闷声发大财”?

“错过了几个亿”?

“共同富裕”?

“寡头垄断”?

 

现在用试验来模拟红包接力的游戏:

(1)假设有一个50人的群;

(2)假设每人初始金额为50元;

(3)假设每次红包金额是20元;

(4)假设每次发给10个人;

(5)假设“手气最佳”开始发下一轮;

(6)假设发完红包,即扣除20元,之后余额变成了负值,就破产退出游戏。

 

试验将 α 设为2,并让红包接力100次,最后的模拟结果为:

(1)有2位朋友不幸破产;

(2)资产最多的有92.20元,几乎翻了一倍;


分析试验结果:

(1)破产的玩家都是“手气最佳”次数太多,导致入不敷出;

(2)资产最多的玩家属于“闷声发大财”,从未获得过“手气最佳”。

 

当然,概率面前人人平等,没有谁能预知自己抽中红包后会是最大的还是最小的,所以从对称性的角度考虑,个人选择的结果是完全随机的。

 

但是,从整个群的角度来看,有一个指标却在悄悄发生变化,那就是这个群的“贫富差距”

画外音:注意,这不是单次贫富差距,是随着轮数增多的贫富差距。

 

在游戏最开始的时候,群友的资金都是一样的,在若干次迭代之后,群友的贫富差距被拉大了,那么:

(1)如何量化这种贫富差距?
(2)随着游戏的继续,贫富差距会有怎样的变化?
 

如何量化贫富差距?

:基尼系数(Gini Coefficient)。

 

基尼系数通常被用来衡量一个国家居民收入的公平性,其取值在0到1之间,越大表示贫富差距越大,即少部分的人掌握了这个经济体大部分的收入。

 

观察每一轮结束之后,基尼系数的变化,结果如下:

拜托,面试别再问我抢红包概率了!!!
可以看出,随着接力的进行,基尼系数的整体趋势是在不断变大的,意味着贫富差距会随着游戏的进行变得越来越大。

 

这其实也很好理解:总是会有人因为拿了太多“手气最佳”而破产,这样财富会在越来越少的人中间进行分配,所以相应地贫富差距就拉大了。

 

基尼系数的趋势,和什么有关呢?
:在游戏的模型中,有一个参数 α 用来控制红包金额分配的“公平”程度。

画外音:α 越大,单次分割就越平均。

 

调整一下α 值,再来观察基尼系数的变化趋势。

拜托,面试别再问我抢红包概率了!!!
上图:红线 α=2,绿线 α=20

 

可以看出,红线和绿线虽然有所重叠,但总体来看绿线的取值要比红线更大,也就是说:单次红包分配越“公平”,多次分配后,贫富差距反而会越大。

 

听起来可能有些反直觉,但其实也合情合理:

(1)如果红包的分配是绝对公平的,那么第一名得到的金额就将是2元,而下一轮又必须送出20元,亏得多,穷得快;

(2)如果红包金额的波动性很大,第一名就会得到更多,也就更不容易破产;

 

所以说,一个规则是否真的“公平”,不能只看其表面。今天就到这里,希望大家有收获。

 

作业题,1块钱随机分成n份儿:

(1)最大值的期望是多少?
(2)最小值的期望是多少?


推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
author-avatar
kg9854997
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有