一次抽奖引发的“随机”畅想

忆苦思甜

Posted by 薛以致用 on April 2, 2020

申明

本站点所有文章,仅代表个人想法,不代表任何公司立场,所有数据都来自公开资料

转载请注明出处

首次1元付费阅读《工作在 AWS 2020四周年记》尝试,我感觉到跟读者互动的必要,所以,为了进一步回馈读者,需要设计一个抽奖送书活动,这里就涉及一个很有趣的事情,就是如果让号友们参与到这个活动中,并满足抽奖的公平性命题呢?

利用逆向工作法先回答五个问题:

  1. 客户是谁? 公众号读者
  2. 客户面临的挑战或机会是什么? 由于缺少评论功能,客户的互动仅限于阅读、转发和在看,期望能通过其他方式增强用户互动探讨
  3. 客户获得的最大收益? 打赏和付费金额的积累可以通过抽奖活动反馈客户
  4. 你如何知道客户有这样的需求? 朋友圈的点评,参考其他公众号的讨论群经验,以及线下的一些交流反馈
  5. 客户的用户体验如何? 这也是本文要详细探究的,比如要不要组建讨论群,抽奖活动如何展开等等

幸运大转盘

AWS Wheel

第一个映入我脑海的就是幸运大转盘,商场里面有些商家会在门口会放置这样的一个转盘,一个圆形的转盘平面被切分成很多块,某些小块中有中奖信息,我闺女就很喜欢这个游戏,每次碰到都想尝试一下,好处是用户互动感强,你可以自己用力转动,直到为幸运之神落到你的身上而兴奋一整天;但缺点也很明显,如果有很多参与者,奖品数量有限的情况下,怎么让每个人都能参与到互动转盘游戏呢?

所以,一个改进方案,就是转盘上写的不是中奖信息,而是放上所有参与者的唯一标识,这样有多少奖品就转动几次,就能产生中奖结果信息,那互动就缺了那么点意思,谁来转动幸运大转盘?

小小抽奖互动,不简单:

AWS Wheel

顺着幸运大转盘的思路,我在想是不是利用云服务来写一个这样的页游应用,很偶然的机会,在调研如何保障 AWS 在全球高效运营的话题时,发现幸运大转盘居然在实际的运营场景也被采用,顿时引起了我的好奇心。

AWS 从2006年第一个云服务 S3开始,为了坚持云服务运营的高标准,十多年来形成了一个机制:高层领导、所有服务总经理和众多工程师每周召开一次两小时的会议,审核服务指标、提出和解决问题并分享最佳实践。但当服务超过 100之后,再召开这样的会议变得非常困难,当然我们可以选择每次缩减汇报的服务团队数量,再通过计划轮流以保障所有团队都有机会进行汇报和参与分享;

但回到我们该机制的初衷,是期望无论是否被选中在该会议上汇报,每个服务团队都能认真准备,并确保团队领导能够了解这些细节,因此我们采取了类似幸运大转盘抽奖的模式。

每周的例会如果团队被选中会有 15分钟的时间聚焦该团队的服务议题,除非必要,我们会讨论特定的问题,但大多数时间我们采用转盘的方式随机选择一个团队,被选中的团队有机会呈现他们的运营面板的内容,阐述运营绩效,并回答其他有经验的资深运营人员的提问。

转盘的实现,也是从实物转盘逐渐过渡到可以随着服务数量扩大不断更新的在线转盘,因此 AWS 团队还开源了该幸运大转盘的实现:https://github.com/aws/aws-ops-wheel

欢迎大家自己一键部署和持续贡献自己的想法~

该转盘前端交互利用 Nodejs,后台逻辑基于 Python,数据存储利用了 Amazon DynamoDB,服务利用 AWS Lambda 应用程序进行包装,并通过 Amazon API Gateway 进行分发和 REST 接口定义,同时该实现还利用了 Amazon Cognito User Pool 实现了用户管理,整个架构无需一台虚拟机,也就是我们常说的无服务器架构,在没有访问的时候,成本接近零,如果叠加免费账户额度,你可以和小伙伴一起开心玩耍。

Book Wheel

随机方法的妙用

如上我们可以从 AWS 利用转盘这种随机选择在大规模服务运营日常工作中的应用,看到,利用随机方法的解决方案非常简洁有效。

说到随机,我想再跟大家唠唠蒲丰(Buffon)投针实验和蒙特卡罗模拟。

18世纪法国科学家蒲丰(Buffon)设计了一个很有意思的计算圆周率 π 的实验方法,就是投针实验,在一张纸上画出一组距离为 l 的平行线,并找到一个粗细均匀的长度为 a 的细针,针的长度 a 小于 l,将细针随机抛出落在纸上,记录抛出总次数 N 以及细针跟平行线相交的次数 n,就可以计算出 π 的值,具体数学推导过程略过,最后可以得出 π ≈ (2aN) / (l*n)

历史上有记载的实验数据如下:

实验者 针长 线间距 投针次数 相交次数 π 值
Wolf 0.80 1 5000 2523 3.170828
Smith 0.6 1 3204 1218 3.156650
Fox 0.75 1 1030 489 3.159509

是不是很神奇?

蒲丰实验为现代的蒙特卡罗方法奠定了基础,即在大数定理下,事件发生的频率近似于事件发生的概率;简单而言,蒙特卡罗方法是利用计算机通过大量反复的随机模拟实验,完成问题的求解数值方法。本质是利用大量随机数(计算机模拟是伪随机数)来解决问题的方法。

如下 Python 实现用来展现如何利用蒙特卡罗方法计算 π 值,我这边运行的结果显示,π 的蒙特卡罗方法计算的近似值为:3.141704,相对于投针实验,计算机可以加大随机模拟次数,从而得到更准确的结果。

#!/usr/bin/python
# 蒙特卡罗模拟计算 π
# 原理:在一个边长为2 的正方形中心,画一个半径为 1 的内切圆,那正方形与圆的面积比为:4 / π
#       而利用蒙特卡罗模拟,我们模拟尽量多次的随机撒点到正方形区域内,落在圆内的次数 m 与整个实验次数 n(落在正方形)的频率,
#       根据大数定理接近上面的面积比,也就是说 π = 4 * (m / n)
import random
from time import perf_counter

start = perf_counter()
# π的计算

total=6000000

r=1.0 #内切圆半径
a,b=(0.0,0.0) #内切圆圆心
xmin,xmax=a-r,a+r #正方形 x 轴数值范围 [-1,1]
ymin,ymax=b-r,b+r #正方形 y 轴数值范围 [-1,1]

countInCicle = 0
for i in range(0,total):
    x=random.uniform(xmin,xmax)
    y=random.uniform(ymin,ymax)
    distance=pow((x-a)**2+(y-b)**2,0.5) # 计算和圆心的距离
    if distance <= r:
        countInCicle = countInCicle + 1

print('落在圆内的点有%i个' % countInCicle)

pi = 4*countInCicle/total
print("π 的蒙特卡罗方法计算的近似值为:",pi)

end = perf_counter() - start
print("运行时间是:{:.2f}S".format(end))

蒙特卡罗方法除了用来求解 π 值之外,还在很多领域有非常多的应用实践,比如蒙特卡洛方法实现21点游戏策略,《金融学和保险学中的蒙特卡罗方法与模型》,欧洲期权蒙特卡洛定价等等。

参考资料:


公众号二维码

诞生于 2019,遇见 2020。

感谢关注,欢迎动动手指标星和置顶;

这样就不会错过少但精彩的技术探讨、团队建设、案例分享!

每周至少一更,转发是对我的最大鼓励!

学习之路漫漫,走走停停,
偶有所感,随心所记,
言由心声,问心无愧!

从客户中来,到客户中去!