微信红包随机生成算法(PHP版)
- /**
- * 求一个数的平方
- * @param $n
- */
- function sqr($n){
- return $n*$n;
- }
- /**
- * 生产min和max之间的随机数,但是概率不是平均的,从min到max方向概率逐渐加大。
- * 先平方,然后产生一个平方值范围内的随机数,再开方,这样就产生了一种“膨胀”再“收缩”的效果。
- */
- function xRandom($bonus_min,$bonus_max){
- $sqr = intval(sqr($bonus_max-$bonus_min));
- $rand_num = rand(0, ($sqr-1));
- return intval(sqrt($rand_num));
- }
- /**
- *
- * @param $bonus_total 红包总额
- * @param $bonus_count 红包个数
- * @param $bonus_max 每个小红包的最大额
- * @param $bonus_min 每个小红包的最小额
- * @return 存放生成的每个小红包的值的一维数组
- */
- function getBonus($bonus_total, $bonus_count, $bonus_max, $bonus_min) {
- $result = array();
- $average = $bonus_total / $bonus_count;
- $a = $average - $bonus_min;
- $b = $bonus_max - $bonus_min;
- //
- //这样的随机数的概率实际改变了,产生大数的可能性要比产生小数的概率要小。
- //这样就实现了大部分红包的值在平均数附近。大红包和小红包比较少。
- $range1 = sqr($average - $bonus_min);
- $range2 = sqr($bonus_max - $average);
- for ($i = 0; $i < $bonus_count; $i++) {
- //因为小红包的数量通常是要比大红包的数量要多的,因为这里的概率要调换过来。
- //当随机数>平均值,则产生小红包
- //当随机数<平均值,则产生大红包
- if (rand($bonus_min, $bonus_max) > $average) {
- // 在平均线上减钱
- $temp = $bonus_min + xRandom($bonus_min, $average);
- $result[$i] = $temp;
- $bonus_total -= $temp;
- } else {
- // 在平均线上加钱
- $temp = $bonus_max - xRandom($average, $bonus_max);
- $result[$i] = $temp;
- $bonus_total -= $temp;
- }
- }
- // 如果还有余钱,则尝试加到小红包里,如果加不进去,则尝试下一个。
- while ($bonus_total > 0) {
- for ($i = 0; $i < $bonus_count; $i++) {
- if ($bonus_total > 0 && $result[$i] < $bonus_max) {
- $result[$i]++;
- $bonus_total--;
- }
- }
- }
- // 如果钱是负数了,还得从已生成的小红包中抽取回来
- while ($bonus_total < 0) {
- for ($i = 0; $i < $bonus_count; $i++) {
- if ($bonus_total < 0 && $result[$i] > $bonus_min) {
- $result[$i]--;
- $bonus_total++;
- }
- }
- }
- return $result;
- }
- $bonus_total = 200;
- $bonus_count = 100;
- $bonus_max = 10;//此算法要求设置的最大值要大于平均值
- $bonus_min = 1;
- $result_bonus = getBonus($bonus_total, $bonus_count, $bonus_max, $bonus_min);
- $total_money = 0;
- $arr = array();
- foreach ($result_bonus as $key => $value) {
- $total_money += $value;
- if(isset($arr[$value])){
- $arr[$value] += 1;
- }else{
- $arr[$value] = 1;
- }
- }
- //输出总钱数,查看是否与设置的总数相同
- echo $total_money;
- //输出所有随机红包值
- var_dump($result_bonus);
- //统计每个钱数的红包数量,检查是否接近正态分布
- ksort($arr);
- var_dump($arr);
微信红包随机生成算法(PHP版)的更多相关文章
- roguelike地图的随机生成算法
如果要想自己设计一个roguelike游戏,那么需要你有一个随机地图生成,我在indienova上看到一篇文章,描述了一个roguelike算法,然后自己用unity实现了一个下. 原文地址:随机生成 ...
- python红包随机生成(隔板法)
#红包生成思路#200 块钱 10个红包#0-200 的一个轴,随机取9个点,分成10段, 每一段的值表示一个红包的大小 #把输入的 money值 * 100 拿到的数值就是分, 不用再考虑单位是元的 ...
- 如何用 js 实现一个类似微信红包的随机算法
如何用 js 实现一个类似微信红包的随机算法 js, 微信红包, 随机算法 "use strict"; /** * * @author xgqfrms * @license MIT ...
- 研究微信红包分配算法之Golang版
今天来看一下红包的分配,参考几年前流传的微信红包分配算法,今天用Golang实现一版,并测试验证结果. 微信红包的随机算法是怎样实现的?https://www.zhihu.com/question/2 ...
- 微信红包中使用的技术:AA收款+随机算法
除夕夜你领到红包了吗?有的说“我领了好几K!”“我领了几W!” 土豪何其多,苦逼也不少!有的说“我出来工作了,没压岁钱了,还要发红包”.那您有去抢微信红包吗?微信群中抢“新年红包”春节爆红.618微信 ...
- PHP实现微信随机红包算法和微信红包的架构设计简介
微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...
- PHP用抛物线的模型实现微信红包生成算法的程序源码
<?php /* *Author:Kermit *Time:2015-8-26 *Note:红包生成随机算法 */ header("Content-type:text/html;cha ...
- PHP微信红包生成算法的程序源码(用抛物线的模型实现)
代码如下: <?php /* * 红包生成随机算法 */ header("Content-type:text/html;charset=utf-8"); date_defau ...
- PHP实现微信红包算法和微信红包的架构设计简介
微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...
随机推荐
- 高性能高并发网络库:StateThreads
StateThreads是一个C的网络程序开发库,提供了编写高性能.高并发.高可读性的网络程序的开发库,轻量级网络应用框架 共也就3000行C代码 网络程序(Internet Application) ...
- osql.exe 批处理sql 文件
.bat文件内容 "C:\Program Files\Microsoft SQL Server\110\Tools\Binn\osql.exe" -U sa -P sa -S 19 ...
- 普通windows版本安装winServer的特色功能 以dedup功能为展示点
安装 Windows 功能角色 1.选择安装源 在 Windows 8.1 系统上不存在重复数据删除功能,需要从对应的服务器版本,即 Windows Server 2012 R2 上提取相关文件. 2 ...
- 自然语言交流系统 phxnet团队 创新实训 个人博客 (一)
项目涉及链表操作,遂整理: 使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理.但是链表失去了数组随机读取的优点,同时链表由于增加了结点 ...
- Oracle数据库表空间与数据文件的关系描述正确的是( )
Oracle数据库表空间与数据文件的关系描述正确的是( ) A.一个表空间只能对应一个数据文件 B.一个表空间可以对应多个数据文件 C.一个数据文件可以对应多个表空间 D.表空间与数据文件没任何对应关 ...
- C# winform 获取当前路径
// 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory// 获取模块的完整路径.System.Diagnostics.Process.Get ...
- (转)MFC的ClistCtrl删除选中多行项目
MFC的ClistCtrl控件添加了多行数据后,若要删除选中的多行数据,可以使用ClistCtrl的成员函数,在网上找了很多例子,发现都有问题,因为在删除ClistCtrl行的时候,删除行下面的行会上 ...
- (转)S5pv210 HDMI 接口在 Linux 3.0.8 驱动框架解析 (By liukun321 咕唧咕唧)
作者:liukun321 咕唧咕唧 日期:2014.1.18 转载请标明作者.出处:http://blog.csdn.net/liukun321/article/details/18452663 本文 ...
- node.js执行shell命令
nodejs功能强大且多样,不只是可以实现 服务器端 与 客户端 的实时通讯,另一个功能是用来执行shell命令 首先,引入子进程模块 var process = require('child_pro ...
- ThinkPHP重写规则优化URL及Rewrite规则详细说明
示例如下: http://www.topstack.cn/Article/detail/id/198.html 优化为 http://www.topstack.cn/article-198.html ...