php實現紅包演算法(隨機)
阿新 • • 發佈:2018-12-04
tip:兩個隨機發紅包發紅包的演算法 紅包的總金額 與 個數 是接收的輸入值
如在開發中用到 ,可視情況更改。
如有什麼更好的思路,歡迎分享~
<?php # 搶紅包演算法基礎版 (金額引數以分為單位) 二倍均值法 ## 基本思路:剩餘紅包金額為M,剩餘人數為N,那麼有如下公式: ## 每次搶到的金額 = 隨機區間 (0, M / N X 2) ### 引數:(int)$total : 紅包總金額(分) (int)$num : 所發紅包個數 function getHong($total = 0 , $num = 0) { $bag = []; if ($total == 0 || $num == 0 || $total < $num) { return false; } if ($num == 1) { $bag[] = $total; return $bag; } for($i = 0; $i < $num ; $i++) { // echo '剩餘人數:' . ($num - $i) . "\t\n"; if ( ($num - $i) == 1) { array_push($bag, $total); break; } // echo "剩餘總金額:" . $total . "\t\n"; $_tmp = floor($total / ($num - $i) * 2); //紅包數 // echo "當前紅包最大限額:" . $_tmp . "\t\n"; $_red_bag = rand(1, $_tmp - ($num - $i) - 1); // echo "本次預計搶到紅包數:" . $_red_bag . "\t\n"; array_push($bag, $_red_bag); $total = $total - $_red_bag; } echo "\n"; return $bag; } /************************* // print_r($argv); print_r('您輸入的紅包數為:' . $argv[1] . "\t\n您輸入的人數為:" . $argv[2] . "\t\n\n"); $res = getHong($argv[1]*100, $argv[2]); // print_r($res); foreach ($res as $_key => $_value) { echo "紅包為:" . $_value/100 . "\n"; } ****************************/ # 搶紅包方法二 線段切割法 ## 基本思路:將金額總量 最為一個整體M N個人來分 則分N-1次 先分開,然後依次拿走 ## 可能遇到的問題:①隨機分出現重複 ②如何儘可能降低時間複雜度和空間複雜度。 function getHongTwo($total = 0 , $num = 0) { $bag = []; $max = 0; for ($i=0; $i < $num - 1; $i++) { $_bag = is_repeat($bag, $total); if ($_bag > $max) { $max = $_bag; } array_push($bag, $_bag); } sort($bag); $money = []; for ($i=0; $i < count($bag); $i++) { if ($i == 0) { $_money = $bag[$i]; }else { $_money = $bag[$i] - $bag[$i - 1]; } array_push($money, $_money); } # 最後一個值(max可以不進行比較,在陣列排序後 選擇$bag[$num-2]) $_quantity = $total - $max; array_push($money, $_quantity); return $money; } function is_repeat($array = [] , $max = 0) { $_bag = rand(1,$max - 1); if (in_array($_bag, $array)) { $_bag = is_repeat($array , $max); } return $_bag; } // print_r('您輸入的紅包數為:' . $argv[1] . "\t\n您輸入的人數為:" . $argv[2] . "\t\n\n"); $res = getHongTwo($argv[1]*100, $argv[2]); // print_r( $res ); foreach ($res as $_key => $_value) { echo "紅包為:" . $_value/100 . "\n"; }