使用php实现微信红包及其二倍均值算法代码详解
二倍均值法
剩余红包金额为M,剩余人生为N,那么有如下的公式:
每次抢到的金额 = 随机区间 (0, M/N *2)
举个例子:
假设有10个人,红包金额为10元,
第1个人抢到的金额范围为 (0, 10/10 * 2),平均为1 元。
第2个人抢到的金额范围为 (0, 9/9 * 2),平均为1 元。
…
第10个人抢到的金额范围为 (0, 1/1 * 2),平均为1 元。
代码如下:
<?php
//红包金额100元,分10次发送
//2位小数的随机数
function randomFloat($min = 0, $max = 1)
{
$num = $min + mt_rand() / mt_getrandmax() * ($max - $min);
return sprintf("%.2f", $num);
}
//公用函数
function pingjunhongbao($total_money, $total_times)
{
$number = $total_times;
for ($i = 1; $i <= $total_times; $i++) {
if ($i == $total_times) {
$red_bao = $total_money;
} else {
echo "total_money==" . $total_money;
echo "<br>";
echo "number==" . $number;
echo "<br>";
echo "total_money/total_times* 2==" . $pingjun = round($total_money / $number * 2, 2);
echo "<br>";
echo '随机0.01和' . $pingjun . '之间两位小数的值是:' . randomFloat(0.01, $pingjun);
echo "<br>";
$red_bao = round(randomFloat(0.01, $total_money / $number * 2), 2);
}
$total_money -= $red_bao;
$number -= 1;
echo "<br><br><br>";
print_r("第{$i}个人抢到{$red_bao}元红包,剩余红包{$total_money}元");
echo "<br>";
}
}
$total_money = 100;
$total_times = 10;
echo "共计" . $total_money . "元钱,分给" . $total_times . "个人";
echo "<hr>";
pingjunhongbao($total_money, $total_times);
?>
结果展示:
共计100元钱,分给10个人total_money==100
number==10
total_money/total_times* 2==20
随机0.01和20之间两位小数的值是:6.57
第1个人抢到0.59元红包,剩余红包99.41元
total_money==99.41
number==9
total_money/total_times* 2==22.09
随机0.01和22.09之间两位小数的值是:18.64
第2个人抢到13.18元红包,剩余红包86.23元
total_money==86.23
number==8
total_money/total_times* 2==21.56
随机0.01和21.56之间两位小数的值是:11.41
第3个人抢到7.26元红包,剩余红包78.97元
total_money==78.97
number==7
total_money/total_times* 2==22.56
随机0.01和22.56之间两位小数的值是:15.14
第4个人抢到21.95元红包,剩余红包57.02元
total_money==57.02
number==6
total_money/total_times* 2==19.01
随机0.01和19.01之间两位小数的值是:13.34
第5个人抢到0.7元红包,剩余红包56.32元
total_money==56.32
number==5
total_money/total_times* 2==22.53
随机0.01和22.53之间两位小数的值是:14.43
第6个人抢到2.3元红包,剩余红包54.02元
total_money==54.02
number==4
total_money/total_times* 2==27.01
随机0.01和27.01之间两位小数的值是:1.63
第7个人抢到4.14元红包,剩余红包49.88元
total_money==49.88
number==3
total_money/total_times* 2==33.25
随机0.01和33.25之间两位小数的值是:30.49
第8个人抢到27.25元红包,剩余红包22.63元
total_money==22.63
number==2
total_money/total_times* 2==22.63
随机0.01和22.63之间两位小数的值是:19.09
第9个人抢到7.97元红包,剩余红包14.66元
第10个人抢到14.66元红包,剩余红包0元