之前一直在思考关于微信的红包算法是如何实现的,就在网上找了很多相关的技术但大都是java写的,了解了其中的原理和思路就自己用php搞搞玩,下面大概总结了2种方法,请大家参考一下:
第一种:二倍均值法
第二种:线段分割法
下面先用2种方法去实现第一种
1.1 方法----------------------------
$money = 100; //100元
$peoples = 10; //10人参与
$min = 1;//最小金额 1元
$rest_amount = $money;
$rest_peoples = $peoples;
$getAmount = 0;
for($i=0;$i<$peoples;$i++){
//随机范围:[1,剩余人均金额的两倍),左闭右开
$lastOne = $peoples - 1;
if($i != $lastOne){
$getAmount = rand($min, ($rest_amount / $rest_peoples * 2)); //精华
$res[$i] = $getAmount;
$rest_amount = $rest_amount - $getAmount;
$rest_peoples--;
}else{
$res[$i] = $rest_amount; //这边跟他们的不一样(最后一个人是剩余金额,防止不足或超出总金额)
}
}
echo '<pre>';
print_r($res);
echo array_sum($res);
die;
大家看一下结果:
结果1
结果2:
结论:感觉随机的结果没微信初始的好;再看下面的方法:
$total=100;//红包总额
$num=10;// 分成10个红包,支持10人随机领取
$min=1;//每个人最少能收到1元
$data = [];
for ($i=1;$i<$num;$i++)
{
$safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限 扣除剩余最低金额,一半的最大,随机
$money=mt_rand($min*100,$safe_total*100)/100;
$total=$total-$money;
$data[$i] = $money;
}
$data[$num] = $total;
echo '<pre>';
print_r($data);
echo array_sum($data);
die;
结果如下:
或者:
貌似这种结果还算靠近微信的结果,很少出现1元最低的情况;
//----------------第二种方法(线段分割法)--------------
我们可以把红包总金额想象成一条很长的线段,而每个人抢到的金额,则是这条主线段所拆分出的若干子线段。由“切割点”来决定。当N个人一起抢红包的时候,就需要确定N-1个切割点。
因此,当N个人一起抢总金额为M的红包时,我们需要做N-1次随机运算,以此确定N-1个切割点。随机的范围区间是(1, M)。
当所有切割点确定以后,子线段的长度也随之确定。这样每个人来抢红包的时候,只需要顺次领取与子线段长度等价的红包金额即可。
$total=100;//红包总额
$num=10;// 分成10个红包,支持10人随机领取
$min=1;//每个人最少能收到1元
$data = $money = [];
for ($i=0;$i<$num;$i++)
{
$data[$i] = mt_rand($min,$total);
}
$sum = array_sum($data);
$last = $num-1;
for($k=0;$k<$last;$k++){ //0~8
$money[$k] = round(($data[$k] / $sum) * $total,2);
}
$money[$last] = $total - array_sum($money);
echo '<pre>';
print_r($data);
echo '<pre>';
print_r($money);
echo array_sum($money);
die;
结果如下:
或者
这个线段分割法感觉数据随机的还凑合,目前就是这两种方法,如有不足请大家多多指教,共同进步,
谢谢
相关推荐
本文实例讲述了php实现的微信红包算法。分享给大家供大家参考。具体如下: 最近一直在微信群里体验红包功能,红包类型有两种: 1. 普通红包 2. 拼手气红包 普通红包就不用多解析了,大锅饭原理,平分。 拼手气红包讲...
weixin_hongbao微信红包算法
微信红包告诉你,学好数学,真的可以多抢红包!!下面就和大家分享一下抢红包的秘籍,简单概括就是:让朋友先上!
主要介绍了JavaScript实现微信红包算法及遇到的问题解决方法,需要的朋友可以参考下
该程序基本实现了微信红包程序,红包金额为吉利数字,分布比较均匀。 程序解释文章请看 https://blog.csdn.net/weixin_43347550/article/details/105227159 微信红包程序:给定一个钱数m,发红包人数n,其中10, n将...
主要为大家详细介绍了java微信红包实现算法,列出红包的核心算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
* 拼手气红包实现方法[并做手气最佳处理] * 生成num个随机数,每个随机数占随机数总和的比例*money_total的值即为每个红包的钱额 * 考虑到精度问题,最后重置最大的那个红包的钱额为money_total-其他红包的总额 ...
java 实现仿照微信抢红包算法
微信红包拆分算法,可以设置最大值最小值。
以前研究的红包的生成算法,看似觉得简单,实际弄起来不是那么回事,当然如果只是...资源为个人使用 PHP 开发的抛物线的模型实现微信红包生成算法的程序源码 。个人CSDN中也有一篇相关的技术文章,可以对照文章查看。
基于PHP微信红包的算法探讨_.docx
Java 实现微信红包分配算法内含源码以及说明书可以自己运行复现.zip
主要为大家详细介绍了php版的微信红包随机生成算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
递归文件路径+微信红包随机 java的递归算法,寻找电脑某个路径下所有的文件 微信发出200红包,Java递归算法,每个人获得的红包金额随机,拼手气
本文实例讲述了php实现的微信红包算法。分享给大家供大家参考。具体如下: 具体代码: <?php /** * 微信红包的类 * */ CLASS WXHongBao { private $mch_id = 111111;//商户ID写死 private $wxappid = ...
Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...