網絡蒐集的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));