方式1:
/**
* [weixinRandBonus 模拟微信红包]
* @param integer $bonus_total [红包总金额]
* @param integer $bonus_count [红包个数]
* @param integer $bonus_type [红包类型 1 手气红包 0 普通红包]
* @return [array] [返回红包]
*/
function weixinRandBonus($bonus_total=0, $bonus_count=3, $bonus_type=1){
$bonus_items = array(); // 建一个存储红包结果数组
$bonus_balance = $bonus_total; // 每次分完之后的余额
$bonus_avg = number_format($bonus_total/$bonus_count, 2); // 平均每个红包多少钱
$i = 0;
while($i<$bonus_count){
if($i<$bonus_count-1){
$rand = $bonus_type?(rand(1, $bonus_balance*100-1)/100):$bonus_avg; // 根据红包类型计算当前红包的金额
$bonus_items[] = $rand;
$bonus_balance -= $rand;
}else{
$bonus_items[] = $bonus_balance; // 最后一个红包直接承包最后所有的金额,保证发出的总金额正确
}
$i++;
}
return $bonus_items;
}
// 发3个拼手气红包,总金额是100元
$bonus_items = weixinRandBonus(100, 10, 1);
// 查看生成的红包
var_dump($bonus_items);
// 校验总金额是不是正确,看看微信有没有坑我们的钱
var_dump(array_sum($bonus_items));
方式2:
/**
* [weixinSendRandBonus 模拟微信红包]
* @param integer $total [红包总金额]
* @param integer $count [红包个数]
* @param integer $type [红包类型 1 手气红包 0 普通红包]
* @return [array] [返回红包]
*/
function weixinSendRandBonus($total=0, $count=3, $type=1){
if($type==1){
$input = range(0.01, $total, 0.01);
if($count>1){
$rand_keys = (array) array_rand($input, $count-1);
$last = 0;
foreach($rand_keys as $i=>$key){
$current = $input[$key]-$last;
$items[] = $current;
$last = $input[$key];
}
}
$items[] = $total-array_sum($items);
}else{
$avg = number_format($total/$count, 2);
$i = 0;
while($i<$count){
$items[] = $i<$count-1?$avg:($total-array_sum($items));
$i++;
}
}
return $items;
}
运行:
// 发10个拼手气红包,总金额是100元
$bonus_items = weixinSendRandBonus(100, 10, 1);
// 查看生成的红包
var_dump($bonus_items);
// 校验总金额是不是正确,看看微信有没有坑我们的钱
var_dump(array_sum($bonus_items));
有什么好的算法可以再下面给我留言.谢谢!欢迎提意见.