首页 > 代码库 > 红包算法
红包算法
<?php
$r = redEnvelope(100, 10, 12, 6);
echo array_sum($r); //校验结果
print_r($r); //查看分布
function redEnvelope($sum, $num, $max, $min){
$result = array_fill(0, $num, $min);
$loop = $sum - $num * $min;
$i = 0;
while($loop) {
$randNum = mt_rand(1, min($loop, $max - $min));
if($randNum && $result[$i] + $randNum <= $max) {
$result[$i] += $randNum;
$loop -= $randNum;
}
$i = ($i + 1) % $num;
} //分配结束
//$max 至多出现一次
$m = array_keys($result, max($result));
if(count($m) > 1 && $result[$m[0]] == $max) {
for($i=1; $i<count($m); $i++) {
$n = array_keys($result, min($result));
$result[$m[$i]]--;
$result[$n[0]]++;
}
}
//$min 至多出现一次
$m = array_keys($result, min($result));
if(count($m) > 1 && $result[$m[0]] == $min) {
for($i=1; $i<count($m); $i++) {
$n = array_keys($result, $min + 2);
$result[$m[$i]]++;
$result[$n[0]]--;
}
}
return $result;
}
红包算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。