1. <?php
  2.  
  3. /*
  4. *Author:Kermit
  5. *Time:2015-8-26
  6. *Note:红包生成随机算法
  7. */
  8.  
  9. header("Content-type:text/html;charset=utf-8");
  10. date_default_timezone_set('PRC');
  11.  
  12. #红包生成的算法程序
  13. class reward
  14. {
  15. public $rewardMoney; #红包金额、单位元
  16. public $rewardNum; #红包数量
  17. public $scatter; #分散度值1-10000
  18. public $rewardArray; #红包结果集
  19.  
  20. #初始化红包类
  21. public function __construct()
  22. {
  23. $this->rewardArray=array();
  24. }
  25.  
  26. #执行红包生成算法
  27. public function splitReward($rewardMoney,$rewardNum,$scatter=100)
  28. {
  29. #传入红包金额和数量
  30. $this->rewardMoney=$rewardMoney;
  31. $this->rewardNum=$rewardNum;
  32. $this->scatter=$scatter;
  33. $this->realscatter=$this->scatter/100;
  34.  
  35. /*
  36. *前言:今天我突然这样一想,比如要把1个红包分给N个人,实际上就是相当于要得到N个百分比数据
  37. * 条件是这N个百分比之和=100/100。这N个百分比的平均值是1/N。
  38. * 并且这N个百分比数据符合一种正态分布(多数值比较靠近平均值)
  39. *观点:微信红包里很多0.01的红包,我觉得这是微信程序里的人为控制,目的是为了防止总红包数超过总额,先分了几个0.01的红包。
  40. * 不然不管是以随机概率还是正态分布都很难会出现非常多的0.01元红包。
  41. */
  42.  
  43. #我的思路:正如上面说的,比如:1个红包发给5个人,我要得出5个小数,它们的和是1,他们的平均值是1/5
  44. #计算出发出红包的平均概率值、精确到小数4位。即上面的1/N值。
  45. $avgRand=round(1/$this->rewardNum,4);
  46.  
  47. #红包的向平均数集中的分布正像数学上的抛物线。抛物线y=ax2,|a|越大则抛物线的开口就越小,|a|越小则抛物线的开口就越大,a>0时开口向上,我们这都是正数,就以a>0来考虑吧。
  48. #程序里的$scatter值即为上方的a,此值除以100,当做100为基准,
  49. #通过开方(数学里的抛物线模型,开方可缩小变化值)得出一个小数字较多(小数字多即小红包多)的随机分布,据此生成随机数
  50. $randArr=array();
  51. while(count($randArr)<$rewardNum)
  52. {
  53. $t=round(sqrt(mt_rand(1,10000)/$this->realscatter));
  54. $randArr[]=$t;
  55. }
  56.  
  57. #计算当前生成的随机数的平均值,保留4位小数
  58. $randAll=round(array_sum($randArr)/count($randArr),4);
  59.  
  60. #为将生成的随机数的平均值变成我们要的1/N,计算一下生成的每个随机数都需要除以的值。我们可以在最后一个红包进行单独处理,所以此处可约等于处理。
  61. $mixrand=round($randAll/$avgRand,4);
  62.  
  63. #对每一个随机数进行处理,并剩以总金额数来得出这个红包的金额。
  64. $rewardArr=array();
  65. foreach($randArr as $key=>$randVal)
  66. {
  67. $randVal=round($randVal/$mixrand,4);
  68. $rewardArr[]=round($this->rewardMoney*$randVal,2);
  69. }
  70.  
  71. #对比红包总数的差异、修正最后一个大红包
  72. sort($rewardArr);
  73. $rewardAll=array_sum($rewardArr);
  74. $rewardArr[$this->rewardNum-1]=$this->rewardMoney-($rewardAll-$rewardArr[$this->rewardNum-1]);
  75. rsort($rewardArr);
  76.  
  77. #对红包进行排序一下以方便在前台图示展示
  78. foreach($rewardArr as $k=>$value)
  79. {
  80. $t=$k%2;
  81. if($t) array_push($this->rewardArray,$value);
  82. else array_unshift($this->rewardArray,$value);
  83. }
  84. $rewardArr=NULL;
  85. return $this->rewardArray;
  86. }
  87.  
  88. }
  89.  
  90. $money=1000; #总共要发的红包数;
  91. $people=50; #总共要发的人数
  92. $scatter=100; #分散度
  93. $reward=new reward();
  94. $rewardArr=$reward->splitReward($money,$people,$scatter);
  95. echo "发放红包个数:{$people},红包总金额{$money}元。下方所有红包总额之和:".array_sum($reward->rewardArray).'元。下方用图展示红包的分布';
  96. echo '<hr>';
  97. echo "<table style='font-size:12px;width:600px;border:1px solid #ccc;text-align:left;'><tr><td>红包金额</td><td>图示</td></tr>";
  98. foreach($rewardArr as $val)
  99. {
  100. #线条长度计算
  101. $width=intval($people*$val*300/$money);
  102. echo "<tr><td>{$val}</td><td width='500px;text-align:left;'><hr style='width:{$width}px;height:3px;border:none;border-top:3px double red;margin:0 auto 0 0px;'></td></tr>";
  103. }
  104. echo "</table>";
  105. ?>

PHP用抛物线的模型实现微信红包生成算法的程序源码的更多相关文章

  1. PHP微信红包生成算法的程序源码(用抛物线的模型实现)

    代码如下: <?php /* * 红包生成随机算法 */ header("Content-type:text/html;charset=utf-8"); date_defau ...

  2. 微信聊天记录查看器(程序+源码) - iOS版

    本文版权归cxun所有,如有转载请注明出处与本文链接,谢谢!原文地址:http://www.cnblogs.com/cxun/p/4338643.html Updates [2016.10.14]感谢 ...

  3. 研究微信红包分配算法之Golang版

    今天来看一下红包的分配,参考几年前流传的微信红包分配算法,今天用Golang实现一版,并测试验证结果. 微信红包的随机算法是怎样实现的?https://www.zhihu.com/question/2 ...

  4. 微信小程序源码推荐

    wx-gesture-lock  微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 sh ...

  5. 复用微信小程序源码包后仍然有原小程序的版本管理怎么处理

    前言: 复用微信小程序源码包后,重新创建项目导入源码包,会发现开发者工具版本管理中仍然有原来小程序的版本,这样就不太好了.毕竟是一个新的小程序,需要有新的版本控制的.那么这个问题怎么处理呢? 解决方案 ...

  6. 微信小程序源码案例大全

    微信小程序demo:足球,赛事分析 小程序简易导航 小程序demo:办公审批 小程序Demo:电魔方 小程序demo:借阅伴侣 微信小程序demo:投票 微信小程序demo:健康生活 小程序demo: ...

  7. 反编译获取线上任何微信小程序源码(转)

    看到人家上线的小程序的效果,纯靠推测,部分效果在绞尽脑汁后能做出大致的实现,但是有些细节,费劲全力都没能做出来.很想一窥源码?查看究竟?看看大厂的前端大神们是如何规避了小程序的各种奇葩的坑?那么赶紧来 ...

  8. 【转】精选十二款餐饮、快递、票务行业微信小程序源码demo推荐

    微信小程序的初衷是为了线下实体业服务的,必须有实体相结合才能显示小程序的魅力.个人认为微信小程序对于餐饮业和快递业这样业务比较单一的行业比较有市场,故整理推荐12款餐饮业和快递业微信小程序源码demo ...

  9. 【最新】破解微信小程序,获取微信小程序源码,破解微信wxapkg,仅需5秒

    一个后端第一次接触iview,就简单写了个网站. 之前看到有人发解析wx小程序源码包的软件,但是因为微信的升级,之前的办法已经不行了.现在重新改了js文件,适配了最新的版本. 之前微信wxapkg包获 ...

随机推荐

  1. python 模块路径查找 及 添加

    **** python 模块路径查找: 通过模块的__file__属性来确定: **** 模块路径添加: 方法一:函数添加1 import sys2 查看sys.path3 添加sys.path.ap ...

  2. 20155204 2016-2017-2 《Java程序设计》第2周学习总结

    20155204 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 本章主要学习了Java语言的基础语法,基本同C语言逻辑相通,比较着学不算难理解,包括了一些简 ...

  3. 10.11课后练习——MyOD系统调用版本

    MyOD系统调用版本 题目要求 参考教材<深入理解计算机(第三版)>第十章内容 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XX ...

  4. 20155320 2016-2017-2《Java程序设计》第十二周课堂实践项目

    20155320 2016-2017-2<Java程序设计>第十二周课堂实践项目 1.修改教材P98 Score2.java, 让执行结果数组填充是自己的学号: 2.在IDEA中以TDD的 ...

  5. 20155322 2017-2018-1《信息安全系统设计》第二周 课堂测试 Linux下C语言实现MYOD

    20155322 2017-2018-1<信息安全系统设计>第二周 课堂测试 Linux下C语言实现MYOD [博客目录] 静态库测试 实现方法 相关资料 操作 动态库测试 实现方法 相关 ...

  6. 【LG3231】[HNOI2013]消毒

    题面 洛谷 题解 代码 \(100pts\) #include<iostream> #include<cstdio> #include<cstdlib> #incl ...

  7. C++ OI图论 学习笔记(初步完结)

    矩阵图 使用矩阵图来存储有向图和无向图的信息,用无穷大表示两点之间不连通,用两点之间的距离来表示连通.无向图的矩阵图是关于主对角线对称的. 如图所示: 使用dfs和bfs对矩阵图进行遍历 多源最短路径 ...

  8. unity游戏在ios11上不显示泰语解决办法

    最近在开发中遇到unity游戏在ios11上不显示泰语的问题,全部显示为方框内一个问号. 通过搜索发现这是Unity的一个bug,在2017.3中修复了 但升级unity风险很大,所以我采用了该文中提 ...

  9. Spring Cloud(三):服务提供与调用 Eureka【Finchley 版】

    Spring Cloud(三):服务提供与调用 Eureka[Finchley 版]  发表于 2018-04-15 |  更新于 2018-05-07 |  上一篇文章我们介绍了 Eureka 服务 ...

  10. linux上open-vswitch安装和卸载

    一. ovs 从源码编译安装: 安装依赖项: # apt-get install make # apt-get install gcc # apt-get install build-essentia ...