PHP随机红包和等额红包的简单实现

18-06-20 17:30 字数 302 阅读 2681 已编辑
$amount = 1; // 红包总金额
$packageCount = 30; // 红包总个数
$randomFlag = true; // 金额是否随机
$grantedAmount = 0; // 已领取的金额
$averageAmount = (float)bcdiv($amount, $packageCount, 2);
if ($averageAmount < 0.01) {
    exit("红包个数不能超过 " . $amount / 0.01 . " 个。\n");
}
echo "================== 发包开始,总共 {$amount} 个红包,发给 {$packageCount} 个人。 ==================\n";
for ($i = 1; $i <= $packageCount; $i++) {
    if ($randomFlag) { // 随机分
        $leftAmount = $amount - $grantedAmount;
        $leftPackage = $packageCount - $i + 1;
        $averageAmount = (float)bcdiv($leftAmount, $leftPackage, 2);
        $random = (float)bcdiv(mt_rand(0, ($averageAmount * 100 - 1)), 100, 2); // 边界
        $changeFunction = mt_rand(0, 1) ? 'bcadd' : 'bcsub';
        $shouldGetAmount = $i == $packageCount ? bcsub($amount, $grantedAmount, 2) : $changeFunction($averageAmount, $random, 2);
    } else { // 平均分
        $shouldGetAmount = $i == $packageCount ? bcsub($amount, $grantedAmount, 2) : $averageAmount;
    }
    $grantedAmount = bcadd($grantedAmount, $shouldGetAmount, 2);
    echo "你是第 {$i} 个领取红包的人,领到 {$shouldGetAmount} 个红包。【当前共发了 {$grantedAmount} 个红包】\n";
}
echo "================== 发包结束,总共发了 {$grantedAmount} 个红包。 ==================\n";
echo "end。 \n";

运行结果

================== 发包开始,总共 1 个红包,发给 30 个人。 ================== 你是第 1 个领取红包的人,领到 0.03 个红包。【当前共发了 0.03 个红包】 你是第 2 个领取红包的人,领到 0.03 个红包。【当前共发了 0.06 个红包】 你是第 3 个领取红包的人,领到 0.01 个红包。【当前共发了 0.07 个红包】 你是第 4 个领取红包的人,领到 0.02 个红包。【当前共发了 0.09 个红包】 你是第 5 个领取红包的人,领到 0.03 个红包。【当前共发了 0.12 个红包】 你是第 6 个领取红包的人,领到 0.03 个红包。【当前共发了 0.15 个红包】 你是第 7 个领取红包的人,领到 0.05 个红包。【当前共发了 0.20 个红包】 你是第 8 个领取红包的人,领到 0.03 个红包。【当前共发了 0.23 个红包】 你是第 9 个领取红包的人,领到 0.05 个红包。【当前共发了 0.28 个红包】 你是第 10 个领取红包的人,领到 0.05 个红包。【当前共发了 0.33 个红包】 你是第 11 个领取红包的人,领到 0.03 个红包。【当前共发了 0.36 个红包】 你是第 12 个领取红包的人,领到 0.01 个红包。【当前共发了 0.37 个红包】 你是第 13 个领取红包的人,领到 0.03 个红包。【当前共发了 0.40 个红包】 你是第 14 个领取红包的人,领到 0.01 个红包。【当前共发了 0.41 个红包】 你是第 15 个领取红包的人,领到 0.02 个红包。【当前共发了 0.43 个红包】 你是第 16 个领取红包的人,领到 0.05 个红包。【当前共发了 0.48 个红包】 你是第 17 个领取红包的人,领到 0.05 个红包。【当前共发了 0.53 个红包】 你是第 18 个领取红包的人,领到 0.03 个红包。【当前共发了 0.56 个红包】 你是第 19 个领取红包的人,领到 0.05 个红包。【当前共发了 0.61 个红包】 你是第 20 个领取红包的人,领到 0.03 个红包。【当前共发了 0.64 个红包】 你是第 21 个领取红包的人,领到 0.01 个红包。【当前共发了 0.65 个红包】 你是第 22 个领取红包的人,领到 0.01 个红包。【当前共发了 0.66 个红包】 你是第 23 个领取红包的人,领到 0.03 个红包。【当前共发了 0.69 个红包】 你是第 24 个领取红包的人,领到 0.02 个红包。【当前共发了 0.71 个红包】 你是第 25 个领取红包的人,领到 0.01 个红包。【当前共发了 0.72 个红包】 你是第 26 个领取红包的人,领到 0.09 个红包。【当前共发了 0.81 个红包】 你是第 27 个领取红包的人,领到 0.05 个红包。【当前共发了 0.86 个红包】 你是第 28 个领取红包的人,领到 0.04 个红包。【当前共发了 0.90 个红包】 你是第 29 个领取红包的人,领到 0.09 个红包。【当前共发了 0.99 个红包】 你是第 30 个领取红包的人,领到 0.01 个红包。【当前共发了 1.00 个红包】 ================== 发包结束,总共发了 1.00 个红包。 ================== end。

1人点赞>
关注 收藏 改进 举报
0 条评论
排序方式 时间 投票
快来抢占一楼吧
请登录后发表评论
站长 @ 十七度
文章
384
粉丝
23
喜欢
195
收藏
31
排名 : 1
访问 : 147.28万
私信