欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

再问红包算法,之前的有bug,@JXYCYFLM,@,该怎么处理

程序员文章站 2022-03-20 18:53:34
...
再问红包算法,之前的有bug,@JXYCYFLM,@
http://bbs.csdn.net/topics/391001579
之前的帖子在此。


两位的算法都是有问题的。

版主给出的修订版,每当红包数量是单数的时候就不对了。加起来不等于总数。


恳请两位大侠帮忙修正。
------解决思路----------------------
$r = distribute(100, 31);
echo array_sum($r), PHP_EOL;
print_r($r);

function distribute($total, $num) {
$avg = $total / $num;
$r = array_fill(0, $num, round($avg, 2));

for($i=0; $i $t = rand(1, $avg * 100) / 100;
$r[$i] -= round($t, 2);
if($r[$i] if(isset($r[$i+1])) $r[$i+1] += round($t, 2);
}
$r[$num-1] = $total - array_sum(array_slice($r, 0, -1));
return $r;
}

$r = distribute(100, 31);
echo array_sum($r), PHP_EOL;
print_r($r);

function distribute($total, $num) {
$avg = round($total / $num, 2);
$r = array_fill(0, $num, $avg);

for($i=0; $i $t = rand(1, $avg * 100) / 100;
$r[$i] -= $t;
if($r[$i] if(isset($r[$i+1])) $r[$i+1] += $t;
}
$r[$num-1] = $total - array_sum(array_slice($r, 0, -1));
return $r;
}

------解决思路----------------------

function distribute($total,$num){
return _distribute($total,$num,$total/$num/2,0);
}
function _ceil($i){
return ((int)($i*100))/100;
}
function _distribute($total,$num,$pj,$last_c){
if($num==0){
return array();
}
else if($num==1){
return array($total);
}
else {
$cz=_ceil(mt_rand(-$pj*100,$pj*100)/100);
$n=_ceil($pj+$cz+$last_c);
$res[]=$n;
if($num-1>=0)
$res=array_merge($res,_distribute($total-$n,$num-1,$pj,$pj-$cz));
return $res;
}
}
$ary=distribute(50,12);
print_r(array_sum($ary));
print_r($ary);

------解决思路----------------------
奉上娱乐型红包代码再问红包算法,之前的有bug,@JXYCYFLM,@,该怎么处理


function fn($total, $part, $min = 0.01) {
$res = array_fill(0, $part, $min);
$total -= $part * $min;
for($i=0; $i return $res;
}
再问红包算法,之前的有bug,@JXYCYFLM,@,该怎么处理

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频