热门标签 | 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)最小值的期望是多少?


推荐阅读
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 深入理解父组件与子组件的引用和访问
    本文详细介绍了如何在Vue.js中通过$children和$refs属性实现父组件对子组件的访问,并提供了具体的代码示例及最佳实践。 ... [详细]
  • LeetCode 540:有序数组中的唯一元素
    来源:力扣(LeetCode),链接:https://leetcode-cn.com/problems/single-element-in-a-sorted-array。题目要求在仅包含整数的有序数组中,找到唯一出现一次的元素,并确保算法的时间复杂度为 O(log n) 和空间复杂度为 O(1)。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
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社区 版权所有