1. /**
  2. * 求一个数的平方
  3. * @param $n
  4. */
  5. function sqr($n){
  6. return $n*$n;
  7. }
  8.  
  9. /**
  10. * 生产min和max之间的随机数,但是概率不是平均的,从min到max方向概率逐渐加大。
  11. * 先平方,然后产生一个平方值范围内的随机数,再开方,这样就产生了一种“膨胀”再“收缩”的效果。
  12. */
  13. function xRandom($bonus_min,$bonus_max){
  14. $sqr = intval(sqr($bonus_max-$bonus_min));
  15. $rand_num = rand(0, ($sqr-1));
  16. return intval(sqrt($rand_num));
  17. }
  18.  
  19. /**
  20. *
  21. * @param $bonus_total 红包总额
  22. * @param $bonus_count 红包个数
  23. * @param $bonus_max 每个小红包的最大额
  24. * @param $bonus_min 每个小红包的最小额
  25. * @return 存放生成的每个小红包的值的一维数组
  26. */
  27. function getBonus($bonus_total, $bonus_count, $bonus_max, $bonus_min) {
  28. $result = array();
  29.  
  30. $average = $bonus_total / $bonus_count;
  31.  
  32. $a = $average - $bonus_min;
  33. $b = $bonus_max - $bonus_min;
  34.  
  35. //
  36. //这样的随机数的概率实际改变了,产生大数的可能性要比产生小数的概率要小。
  37. //这样就实现了大部分红包的值在平均数附近。大红包和小红包比较少。
  38. $range1 = sqr($average - $bonus_min);
  39. $range2 = sqr($bonus_max - $average);
  40.  
  41. for ($i = 0; $i < $bonus_count; $i++) {
  42. //因为小红包的数量通常是要比大红包的数量要多的,因为这里的概率要调换过来。
  43. //当随机数>平均值,则产生小红包
  44. //当随机数<平均值,则产生大红包
  45. if (rand($bonus_min, $bonus_max) > $average) {
  46. // 在平均线上减钱
  47. $temp = $bonus_min + xRandom($bonus_min, $average);
  48. $result[$i] = $temp;
  49. $bonus_total -= $temp;
  50. } else {
  51. // 在平均线上加钱
  52. $temp = $bonus_max - xRandom($average, $bonus_max);
  53. $result[$i] = $temp;
  54. $bonus_total -= $temp;
  55. }
  56. }
  57. // 如果还有余钱,则尝试加到小红包里,如果加不进去,则尝试下一个。
  58. while ($bonus_total > 0) {
  59. for ($i = 0; $i < $bonus_count; $i++) {
  60. if ($bonus_total > 0 && $result[$i] < $bonus_max) {
  61. $result[$i]++;
  62. $bonus_total--;
  63. }
  64. }
  65. }
  66. // 如果钱是负数了,还得从已生成的小红包中抽取回来
  67. while ($bonus_total < 0) {
  68. for ($i = 0; $i < $bonus_count; $i++) {
  69. if ($bonus_total < 0 && $result[$i] > $bonus_min) {
  70. $result[$i]--;
  71. $bonus_total++;
  72. }
  73. }
  74. }
  75. return $result;
  76. }
  77. $bonus_total = 200;
  78. $bonus_count = 100;
  79. $bonus_max = 10;//此算法要求设置的最大值要大于平均值
  80. $bonus_min = 1;
  81. $result_bonus = getBonus($bonus_total, $bonus_count, $bonus_max, $bonus_min);
  82. $total_money = 0;
  83. $arr = array();
  84. foreach ($result_bonus as $key => $value) {
  85. $total_money += $value;
  86. if(isset($arr[$value])){
  87. $arr[$value] += 1;
  88. }else{
  89. $arr[$value] = 1;
  90. }
  91.  
  92. }
  93. //输出总钱数,查看是否与设置的总数相同
  94. echo $total_money;
  95. //输出所有随机红包值
  96. var_dump($result_bonus);
  97. //统计每个钱数的红包数量,检查是否接近正态分布
  98. ksort($arr);
  99. var_dump($arr);

微信红包随机生成算法(PHP版)的更多相关文章

  1. roguelike地图的随机生成算法

    如果要想自己设计一个roguelike游戏,那么需要你有一个随机地图生成,我在indienova上看到一篇文章,描述了一个roguelike算法,然后自己用unity实现了一个下. 原文地址:随机生成 ...

  2. python红包随机生成(隔板法)

    #红包生成思路#200 块钱 10个红包#0-200 的一个轴,随机取9个点,分成10段, 每一段的值表示一个红包的大小 #把输入的 money值 * 100 拿到的数值就是分, 不用再考虑单位是元的 ...

  3. 如何用 js 实现一个类似微信红包的随机算法

    如何用 js 实现一个类似微信红包的随机算法 js, 微信红包, 随机算法 "use strict"; /** * * @author xgqfrms * @license MIT ...

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

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

  5. 微信红包中使用的技术:AA收款+随机算法

    除夕夜你领到红包了吗?有的说“我领了好几K!”“我领了几W!” 土豪何其多,苦逼也不少!有的说“我出来工作了,没压岁钱了,还要发红包”.那您有去抢微信红包吗?微信群中抢“新年红包”春节爆红.618微信 ...

  6. PHP实现微信随机红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

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

    <?php /* *Author:Kermit *Time:2015-8-26 *Note:红包生成随机算法 */ header("Content-type:text/html;cha ...

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

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

  9. PHP实现微信红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

随机推荐

  1. 高性能高并发网络库:StateThreads

    StateThreads是一个C的网络程序开发库,提供了编写高性能.高并发.高可读性的网络程序的开发库,轻量级网络应用框架 共也就3000行C代码 网络程序(Internet Application) ...

  2. osql.exe 批处理sql 文件

    .bat文件内容 "C:\Program Files\Microsoft SQL Server\110\Tools\Binn\osql.exe" -U sa -P sa -S 19 ...

  3. 普通windows版本安装winServer的特色功能 以dedup功能为展示点

    安装 Windows 功能角色 1.选择安装源 在 Windows 8.1 系统上不存在重复数据删除功能,需要从对应的服务器版本,即 Windows Server 2012 R2 上提取相关文件. 2 ...

  4. 自然语言交流系统 phxnet团队 创新实训 个人博客 (一)

    项目涉及链表操作,遂整理: 使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理.但是链表失去了数组随机读取的优点,同时链表由于增加了结点 ...

  5. Oracle数据库表空间与数据文件的关系描述正确的是( )

    Oracle数据库表空间与数据文件的关系描述正确的是( ) A.一个表空间只能对应一个数据文件 B.一个表空间可以对应多个数据文件 C.一个数据文件可以对应多个表空间 D.表空间与数据文件没任何对应关 ...

  6. C# winform 获取当前路径

    // 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory// 获取模块的完整路径.System.Diagnostics.Process.Get ...

  7. (转)MFC的ClistCtrl删除选中多行项目

    MFC的ClistCtrl控件添加了多行数据后,若要删除选中的多行数据,可以使用ClistCtrl的成员函数,在网上找了很多例子,发现都有问题,因为在删除ClistCtrl行的时候,删除行下面的行会上 ...

  8. (转)S5pv210 HDMI 接口在 Linux 3.0.8 驱动框架解析 (By liukun321 咕唧咕唧)

    作者:liukun321 咕唧咕唧 日期:2014.1.18 转载请标明作者.出处:http://blog.csdn.net/liukun321/article/details/18452663 本文 ...

  9. node.js执行shell命令

    nodejs功能强大且多样,不只是可以实现 服务器端 与 客户端 的实时通讯,另一个功能是用来执行shell命令 首先,引入子进程模块 var process = require('child_pro ...

  10. ThinkPHP重写规则优化URL及Rewrite规则详细说明

    示例如下: http://www.topstack.cn/Article/detail/id/198.html 优化为 http://www.topstack.cn/article-198.html ...