再問紅包演算法,之前的有bug,@JXYCYFLM,@,該怎麼處理

來源:互聯網
上載者:User
再問紅包演算法,之前的有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<$num; $i+=2) {
$t = rand(1, $avg * 100) / 100;
$r[$i] -= round($t, 2);
if($r[$i] <= 0) $r[$i] = 0.01;
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<$num; $i+=2) {
$t = rand(1, $avg * 100) / 100;
$r[$i] -= $t;
if($r[$i] <= 0) $r[$i] = 0.01;
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);

------解決思路----------------------
奉上娛樂型紅包代碼


function fn($total, $part, $min = 0.01) {
$res = array_fill(0, $part, $min);
$total -= $part * $min;
for($i=0; $i<$part; $i++) $total -= ($res[$i] += round($i == $part - 1 ? $total : (rand(0, $total * 100)) / 100, 2)) - $min;
return $res;
}
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.