1. 程式人生 > >php實現紅包演算法(隨機)

php實現紅包演算法(隨機)

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";
}