紅包算法 php (隨機 & 固定最大金額與最小金額)

網絡蒐集的3種簡易算法
隨機紅包

function randNum($total, $num){
    $min = 0.01;//每個人最少能收到0.01元
    for($i=1; $i<$num; $i++){
        $safe_total = ($total-($num-$i)*$min)/($num-$i);//隨機安全上限
        if($safe_total < 0.01)
            $safe_total = 0.01;
        $money = mt_rand($min*100, $safe_total*100)/100;
        $total = $total - $money;
        $data[] = round($money, 2);
    }
    $data[] = round($total, 2);
    shuffle($data);//重新打亂數組
    return $data;
}

function randNum2($total, $num){
    $min = 0.01;
    for($i=1; $i<$num; $i++){
        $max = $total-($num-$i)*$min;
        $money = mt_rand($min*100, $max*100)/100;
        $total = $total - $money;
        $data[] = round($money, 2);
    }
    $data[] = round($total, 2);
    shuffle($data);
    return $data;
}

$data = randNum(10, 3);
print_r('<pre>');
print_r($data);

固定最大金額與最小金額 (數學差, 看不懂原理)

#紅包算法 (最大金額和最小金額)
function getRedPackage($money, $num, $min, $max)
{
    $data = array();
    if ($min * $num > $money) {
        return array();
    }
    if($max*$num < $money){
        return array();
    }
    while ($num >= 1) {
        $num--;
        $kmix = max($min, $money - $num * $max);
        $kmax = min($max, $money - $num * $min);
        $kAvg = $money / ($num + 1);
        //獲取最大值和最小值的距離之間的最小值
        $kDis = min($kAvg - $kmix, $kmax - $kAvg);
        //獲取0到1之間的隨機數與距離最小值相乘得出浮動區間,這使得浮動區間不會超出範圍
        $r = ((float)(rand(1, 10000) / 10000) - 0.5) * $kDis * 2;
        $k = round($kAvg + $r, 2);
        $money -= $k;
        $data[] = $k;
    }
    return $data;
}

print_r('<pre>');
print_r(getRedPackage(100,6,0.01,20));





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章