微信红包的分配算法,在知乎上已经有人讨论过了,详见《微信红包的随机算法是怎样实现的?》。基本的原则是:红包分配的钱数满足截尾正态随机数分布。

大致为在截尾正态分布中取随机数,并用其求和数除以总价值,获得修正因子,再用修正因子乘上所有的随机数,得到红包价值。

这种分布意味着:低于平均值的红包多,但是离平均值不远;高于平均值的红包少,但是远大于平均值的红包偏多。

关于正态分布,可参考百科:

正态分布(Normal distribution)又名高斯分布(Gaussian distribution),是一个在数学、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。若随机变量X服从一个数学期望为μ、方差为σ^2的高斯分布,记为N(μ,σ^2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。因其曲线呈钟形,因此人们又经常称之为钟形曲线。我们通常所说的标准正态分布是μ = 0,σ = 1的正态分布。

例如100元总额,分成20份的随机红包,可以这样设置:期望值μ=100/20=5,标准差σ=100,这样红包整体分布大概会是这样(负数可以取绝对值):

红包分布示意图生成器是参考《c# 随机生成1000个满足正态分布的点》写的,核心代码如下:

///

///返回正态分布的值///

/// 第一个均匀分布值

/// 第二个均匀分布值

/// 正态期望

/// 正态方差

/// 分布值或者null

private static double? GetZTFB(double u1, double u2, double e, doubled)

{double? result = null;try{

result= e + Math.Sqrt(d) * Math.Sqrt((-2) * (Math.Log(u1) / Math.Log(Math.E))) * Math.Sin(2 * Math.PI *u2);

}catch(Exception ex)

{

result= null;

}returnresult;

}

让我们加大金额10000和份数2000:可以看到红包分布总是在一定区间之内,符合红包分配的大部分特点,大家拿到的钱都会差不多,但显然这样不是最佳手气拿到的金额,也不够刺激。

实际上基于正态分布的原理,真正的红包要这样处理,参考《别人在抢红包,程序员在研究红包算法》:

this.Cursor =Cursors.WaitCursor;this.chart1.Series[0].Points.Clear();this.listBox1.Items.Clear();double t_max = 0,t_min = 0;

Random rand= newRandom();double total = (double)this.num_Total.Value; ;//红包总额

int num = (int)this.num_Num.Value; ;//红包份数

double min = 0.01;//每个人最少能收到0.01元

doublesafe_total, money;for (int i = 1; i < num; i++)

{

safe_total= (total - (num - i) * min) / (num - i);//随机安全上限

double ztfb_u = total / num;//正态分布期望

double ztfb_fc = ztfb_u;//正态分布方差

money= rand.Next((int)(min * 100), (int)(safe_total * 100)) / 100.0d;this.chart1.Series[0].Points.Add(money);this.listBox1.Items.Add(i + ":" + money.ToString("0.00"));if (money > t_max) t_max =money;if (i == 1) t_min =t_max;if (money < t_min) t_min =money;total = total -money;

}this.label3.Text = string.Format("Max:{0} Min:{1}", t_max.ToString("0.00"), t_min.ToString("0.00"));this.Cursor = Cursors.Default;

同样是10000元,分2000份,大部分人都在20元以下,少数在20~80元,幸运者会超过100元,看起来这样的红包分配比较合理了。

java红包正态分布_红包分配算法相关推荐

  1. java环形链表_数据结构和算法(四)Java实现环形链表

    1. 数据结构和算法(四)Java实现环形链表 1.1 约瑟夫问题 约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中 ...

  2. java shell排序_八大排序算法——希尔(shell)排序

    一.动图演示 二.思路分析希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 简单插入 ...

  3. java 求最大公因数_三种算法求最大公约数——Java实现 | 学步园

    求两个自然数m和n的最大公约数. 连续整除检测: 1. t=min{m,n}: 2. m除以t,如果余数为0,则执行步骤3,否则,执行步骤4: 3. n除以t,如果余数为0,返回t的值作为结果,否则, ...

  4. java贝叶斯_贝叶斯算法Java实现

    前言:朴素贝叶斯分类算法是一种基于贝叶斯定理的简单概率分类算法.贝叶斯分类的基础是概率推理,就是在各种条件的存在不确定,仅知其出现概率的情况下,如何完成推理和决策任务.概率推理是与确定性推理相对应的. ...

  5. ec java sm2证书_国密算法SM2证书制作

    前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...

  6. java折木棍_蓝桥杯算法训练 Sticks(木棍)问题(JAVA)

    问题描述 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你设计一个程序, ...

  7. java实现数据挖掘_数据挖掘Apriori算法的java实现

    对于Apriori算法,Apriori算法是一种挖掘关联规则的频繁项集算法,在很多领域中应用广泛. 它的算法思想是: 1先找到所有的小频繁项集, 2然后做连接步骤,将小频繁项集拼接作为候选集, 3然后 ...

  8. java 实现组合_排列组合算法(JAVA实现)

    组合算法实现 从m个数里面取n个数的算法.最容易理解的就是递归,但是其效率太低. 实现方法一: // 组合算法 // 本程序的思路是开一个数组,其下标表示1到n个数,数组元素的值为1表示其下标 //  ...

  9. 国密算法java源码_国密算法SM2证书制作

    前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...

最新文章

  1. 编译linux内核报错‘make menuconfig‘ requires the ncurses libraries
  2. 第三篇 :Mysql存储引擎、数据导入导出、管理表记录、匹配条件
  3. MFC+OPENCV+显示MAT类型图像
  4. 动态规划算法的应用模型
  5. MySQL入门之触发器
  6. 39 CO配置-控制-产品成本控制-成本对象控制-实际成本核算/物料分类帐-激活评估范围的物料分类账
  7. NLP中的词向量总结与实战:从one-hot到bert
  8. vue.js 添加 fastclick的支持
  9. woff字体找不到导致的404错误
  10. WEB三大攻击之—SQL注入攻击与防护
  11. 【Multisim】关于Multisim仿真“过零比较器”出现的问题以及解决方法
  12. java大马后门_一款免杀php大马的解密与去后门
  13. idea研习录(01)——ideaIU-2017.3.7安装详解
  14. PMP笔记-项目管理过程中的审计类型
  15. 计算机桌面文件删除不掉是怎么了,如何解决电脑桌面文件无法删除问题
  16. ds90ub934 i2c 配置_DS90UB934-Q1 25MHz 至 100MHz 10/12 位 FPD-Link III 串行器和解串器
  17. 解决: Tomcat 启动项目没问题,访问网页页面出现空白无显示
  18. html 在线编辑pdf,iLoveIMG 一个完全免费的PDF文件处理网站,可在线编辑PDF文件
  19. 使用扫码枪(二维码,条码)使用键盘钩子获取扫码数据
  20. 笔记本电脑接通网线联网

热门文章

  1. linux抢占式调度
  2. 【精】LintCode领扣算法问题答案:1029. 寻找最便宜的航行旅途(最多经过k个中转站)
  3. 三部曲简史mobi_尤瓦尔.赫拉利简史三部曲(电子书)
  4. 由子网掩码字符串转换成长度前缀的代码示例
  5. 关于线性稳压器的五个设计细节
  6. 《架构即未来》-技术与商业须融汇贯通!前eBay CTO的实战真经
  7. Java 丢手绢游戏 求和_大班游戏活动_丢手绢
  8. 设备厂商Plc远程上下载程序远程调试运维
  9. Motorola和TI的SPI的区别
  10. 人工智能——搜索策论2