PHP随机红包和等额红包的简单实现
$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。