使用php实现微信红包及其二倍均值算法代码详解

使用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.0120之间两位小数的值是:6.571个人抢到0.59元红包,剩余红包99.41元
total_money==99.41
number==9
total_money/total_times* 2==22.09
随机0.0122.09之间两位小数的值是:18.642个人抢到13.18元红包,剩余红包86.23元
total_money==86.23
number==8
total_money/total_times* 2==21.56
随机0.0121.56之间两位小数的值是:11.413个人抢到7.26元红包,剩余红包78.97元
total_money==78.97
number==7
total_money/total_times* 2==22.56
随机0.0122.56之间两位小数的值是:15.144个人抢到21.95元红包,剩余红包57.02元
total_money==57.02
number==6
total_money/total_times* 2==19.01
随机0.0119.01之间两位小数的值是:13.345个人抢到0.7元红包,剩余红包56.32元
total_money==56.32
number==5
total_money/total_times* 2==22.53
随机0.0122.53之间两位小数的值是:14.436个人抢到2.3元红包,剩余红包54.02元
total_money==54.02
number==4
total_money/total_times* 2==27.01
随机0.0127.01之间两位小数的值是:1.637个人抢到4.14元红包,剩余红包49.88元
total_money==49.88
number==3
total_money/total_times* 2==33.25
随机0.0133.25之间两位小数的值是:30.498个人抢到27.25元红包,剩余红包22.63元
total_money==22.63
number==2
total_money/total_times* 2==22.63
随机0.0122.63之间两位小数的值是:19.099个人抢到7.97元红包,剩余红包14.66元

第10个人抢到14.66元红包,剩余红包0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值