ruby案例分析:微信红包分配

今年和去年一样,央视的春晚再次被广大网友吐槽, 即便全民呼吁“六小龄童上春晚”,齐天大圣仍然没有走上央视舞台。知名时评人石述思转了这样一条微博,今年的春晚导演为了大家抢红包也是拼了,连一分钟好看的节目都没安排。目前全国人民都听牌了,单吊敬业福!

稍微吐槽一下还是回到今天的主题,今天讲一个ruby实战教程——微信红包金额分配算:知乎上的一篇文章讨论的比较深入,个人觉得下面的这个分析比较靠谱。

红包领了不少,据观察红包主要有以下几个限制条件:
1.所有人都能分到红包,也就是不会出现红包数值为0的情况。
2.所有人的红包数值加起来等于支付的金额。
3.红包波动范围比较大,约5%~8%的红包数值在平均值的两倍以上,同时数额0.01出现的概率比较高。
4.红包的数值是随机的,并且数值的分布近似于正态分布。

基本思路:
1.因为要保证每个人都至少抢到一分钱,那么首先给每个人分配1分钱
2.剩下的钱再随机分给每个人,Ruby的随机函数是平均分布的,因此如果需要使红包金额近似正态分布,需要对平均分布进行Box–Muller转换操作
3.由于精度问题,最后一个红包需要用总的红包金额-已分配的金额
4. 得到服从正态分布的随机数的基本思想是先得到服从均匀分布的随机数,再将服从均匀分布的随机数转变为服从正态分布

Box-Muller
Box-Muller是产生随机数的一种方法。Box-Muller算法隐含的原理非常深奥,但结果却是相当简单。
如果在(值域内有两个一致的随机数字U1和U2,
可以使用以下两个等式中的任一个算出一个正态分布的随机数字Z:
Z=R*cos(θ)或Z=R*sin(θ)
其中,R=sqrt(-2*ln(U2));θ=2*πU1
正态值Z有一个等于0的平均值和一个等于1的标准偏差,可使用以下等式将Z映射到一个平均值为m、标准偏差为sd的统计量X:
X=m+(Zsd)

mu和sigma值的确定:
mu的值:
为当前红包的均值,令分配第i个红包时所剩总金额为Ti,所以:Ti = T - 0.01 * k - a0 - … - ai-1
得到:mu = Ti / (k - i)

sigma的值:
sigma的值会直接影响红包数额的分布曲线,根据正态分布的三个sigma定理, 生成的随机数值有95.449974%几率落在(mu-2*sigma,mu+2*sigma)内,为了使得mu-2*sigma = 0,sigma = mu/2。对于生成的随机数落在[0, Ti]以外区间的情况,采用截断处理,统一返回0或者Ti。也就是说,最后生成的随机数值分别有大约6%的几率为0或者大于2*mu,加上保留的0.01
rg = RandomGaussian.new(mu,sigma)
noiseValue = rg.rand.round(2)

测试:
generateMoneyVector(1, 3)
[0.42, 0.38, 0.2]
[0.49, 0.06, 0.45]
[0.18, 0.54, 0.28]
generateMoneyVector(1, 10)
[0.13, 0.11, 0.08, 0.13, 0.01, 0.11, 0.04, 0.15, 0.16, 0.08]
[0.07, 0.12, 0.11, 0.15, 0.08, 0.05, 0.14, 0.18, 0.03, 0.07]
[0.12, 0.08, 0.15, 0.10, 0.11, 0.04, 0.04, 0.10, 0.05, 0.21]

时间: 2024-10-08 09:45:11

ruby案例分析:微信红包分配的相关文章

案例分析发红包

案例分析发红包 用户类 是一个父类,来构造方法 ++++++++++++++++++++++++++++++User.java public class User{ private String name;//姓名 private int money;//余额,也就是当前用户拥有的钱数 public User(){ } public User(String name, int money){ this.name = name; this.money = money; } //展示一下当前用户有多

java实现微信红包分配算法

红包算法分析 有人认为,抢红包的额度是从0.01到剩余平均值*N(N是一个系数,决定最大的红包值)之间,比如一共发了10块钱,发了10个红包:第一个人可以拿到(0.01~1*N)之间的一个红包值,当然为了确保所有人至少有1分钱拿,不能前几个人就把钱拿光了,因此需要有一个判断算法.举个例子,如果每个人都拿了自己的最大值: package 红包分配; public class test { public static void main(String[] args){ float num=10,N=

微信红包的随机算法

微信是采用什么样的算法做到的?简单百度了下,目前尚未有官方的说明,仅仅在知乎里有一个较为热门的讨论,链接戳这里 不过他们讨论的太过于深入,有掉坑之嫌. 我按照自己的逻辑尝试了下,这个算法需要满足以下几点要求 1.每个人都要能够领取到红包:2.每个人领取到的红包金额总和=总金额:3.每个人领取到的红包金额不等,但也不能差的太离谱,不然就没趣味:4.算法一定要简单,不然对不起腾讯这个招牌: 正式编码之前,先搭建一个递进的模型来分析规律 设定总金额为10元,有N个人随机领取: N=1 则红包金额=X元

微信红包金额分配案例

<?php // 本类由系统自动生成,仅供测试用途 class IndexAction extends Action { /* 微信红包的总额有100元,必须要发送给60个用户, 每个用户领取的红包是随机的,且每个用户领取的金额不得大于2元 **/ public function index(){ $total =100;//100元 $amount = 60;//60人 $baseCash = 0.1;//基础值 $arr = $this->assign_money($total,$amou

微信红包金额分配的算法 http://timyang.net/architecture/wechat-red-packet/

虽然春节已经过去一段时间,但不少微信群里面依旧乐此不疲的在玩发红包活动,用户自发的将最初的一个春节拜年的场景功能慢慢演化成一个长尾功能. 用户在微信中抢红包时分成抢包和拆包两个操作.抢包决定红包是否还有剩余金额,但如果行动不够迅速,在拆包阶段可能红包已经被其他用户抢走的情况. 红包的金额是在什么时候算? 据某架构群腾讯财付通专家反馈,红包的金额是拆的时候实时计算,而不是预先分配,实时计算基于内存,不需要额外存储空间,并且实时计算效率也很高.每次拆红包时,系统取0.01到剩余平均值*2之间作为红包

微信红包架构分析

个人红包生成: 1.发红包时,按照设计的快速随机算法,将红包分好若干份. 2.有用户抢红包,直接队列化请求,再从红包序列中取出对应红包 春节红包: 1.红包拆分模块 对红包池(广告商+红包总金额)进行拆分为具体的红包(比如, 苏宁易购:10块, 京东商城:11块) 为了提高性能, 做了如下优化工作: 1.全内存存储和计算, 借鉴redis的实现方式,事件驱动+单线程工作模型(减少因线程切换.加锁导致的CPU消耗). 2.每个节点数据彼此隔离, 同时预先分配加载红包池(广告商+红包总金额). 按照

个人博客作业Week2(微软必应词典客户端的案例分析)

提要:我们生活中很多时候要和软件打交道,大家上课开小差时候玩的手机游戏,买火车票的网站,互相联系用的微信微博,等等都是软件,都很值得分析. 你为何成为它们的用户?它们的团队做对了什么,做错了什么?如果你来做,会做得更好么? 通过各种案例分析,评测,辩论,总结,我们就能看到软件工程的原则在实践中的种种体现. 产品:必应词典客户端 (http://bing.msn.cn/dict/) 关于 微软必应词典客户端 的案例分析 (桌面版 version 3.5.0) 第一部分 调研,评测 调研 1)采访对

微软小娜app案例分析

个人博客作业三:微软小娜APP的案例分析 我们生活中很多时候要和软件打交道,大家上课开小差时候玩的手机游戏,买火车票的网站,互相联系用的微信.QQ,等等都是软件,都很值得分析.你为何成为它们的用户?它们的团队做对了什么,做错了什么?如果你来做,会做得更好么? 通过各种案例分析,评测,辩论,总结,我们就能看到软件工程的原则在实践中的种种体现,学好软件工程,帮助我们在实践中做得更好. 产品 请下载 微软小娜-智能助手,win10,iOS或Android客户端都有! 第一部分 调研, 评测 (软件的b

软工15作业3——案例分析

题目 很多同学有误解: 软件工程课是否就是理论课? 或者是几个牛人拼命写代码,其他人打酱油的课? 要不然就是学习一个程序语言,搞一个职业培训的课? 都不对!软件工程有理论,有实践,更重要的是分析,思辨,总结.在课程中,自己组织团队写一个软件,然后分析,这样能根据切身体会来分析,很有价值,但也有可能"身在此山中",未能看清全局.而且,课程时间有限,我们也不能做很多具体的项目.因此,我们也需要从间接经验中学习,分析.别人的项目的成败同样能够给我们很多启发! 我们生活中很多时候要和软件打交道