PHP生成随机红包高级方法
/** 传输数字必须为正整数,需要小数通过$bonus_float传值进行换算
* @param $bonus_total (必填) 红包总额
* @param $bonus_count (必填) 红包个数
* @param $bonus_max (选填) 每个小红包的最大额 最大值要大于平均值
* @param $bonus_min (选填) 每个小红包的最小额
* @param $bonus_float (选填 Y元J角F分) 红包传入单位
* @return 存放生成的每个小红包的值的一维数组
*/
function getBonus($bonus_total, $bonus_count=20, $bonus_max=0, $bonus_min=1, $bonus_float='Y') {
$total_money = 0;
$arr1 = array();
$arr2 = array();
$res = array();
// 转换传入金额单位 Y元 J角 F分
$tmp_float = $bonus_float;
if($bonus_float=='Y'){ $bonus_float = 1; $num_fmt = 0;}
if($bonus_float=='J'){ $bonus_float = 10; $num_fmt = 1;}
if($bonus_float=='F'){ $bonus_float = 100; $num_fmt = 2;}
// 每人红包平均值
$average = $bonus_total / $bonus_count;
// 防止传入参数越界
if($average > $bonus_max){ echo $bonus_max = round(($bonus_total-$average)/$bonus_count,0)+round($average,0); }
if($average < $bonus_min){ echo $bonus_min = 1; }
$range1 = ($average - $bonus_min)*($average - $bonus_min);
$range2 = ($bonus_max - $average)*($bonus_max - $average);
// 生成随机红包逻辑
for ( $i = 0; $i < $bonus_count; $i++) { if (rand($bonus_min, $bonus_max) > $average) {
$temp = $bonus_min + intval(sqrt(rand(0, (intval($range1)-1))));
$arr1[$i] = $temp;
$bonus_total -= $temp;
} else {
$temp = $bonus_max - intval(sqrt(rand(0, (intval($range2)-1))));
$arr1[$i] = $temp;
$bonus_total -= $temp;
}
}
while ($bonus_total > 0) {
for ($i = 0; $i < $bonus_count; $i++) { if ($bonus_total > 0 && $arr1[$i] < $bonus_max) {
$arr1[$i]++;
$bonus_total--;
}
}
}
while ($bonus_total < 0) {
for ($i = 0; $i < $bonus_count; $i++) {
if ($bonus_total < 0 && $arr1[$i] > $bonus_min) {
$arr1[$i]--;
$bonus_total++;
}
}
}
// 输出格式化数据结果
for ($i = 0; $i < $bonus_count; $i++) {
$arr1[$i] = number_format($arr1[$i]/$bonus_float,$num_fmt,'.','');
//统计每个钱数的红包数量,检查是否接近正态分布
$total_money += $arr1[$i];
if(isset($arr2[$arr1[$i]])){ $arr2[$arr1[$i]] += 1; }else{ $arr2[$arr1[$i]] = 1; }
}
ksort($arr2);
$res["total"] = $total_money."(Y)";
$res["bnmax"] = $bonus_max."(".$tmp_float.")";
$res["bnmin"] = $bonus_min."(".$tmp_float.")";
$res["money"] = $arr1;
$res["count"] = $arr2;
return $res;
}
$bonus_total = 2000;
$bonus_count = 30;
$bonus_max = 90; //最大值要大于平均值
$bonus_min = 1;
$bonus_float = "Y"; //
$result_bonus = getBonus($bonus_total, $bonus_count,$bonus_max);
echo "
";
print_r($result_bonus);
Array
(
[total] => 2000(Y)
[bnmax] => 90(Y)
[bnmin] => 1(Y)
[money] => Array
(
[0] => 74
[1] => 24
[2] => 67
[3] => 73
[4] => 67
[5] => 47
[6] => 69
[7] => 75
[8] => 63
[9] => 44
[10] => 77
[11] => 76
[12] => 70
[13] => 76
[14] => 76
[15] => 72
[16] => 73
[17] => 85
[18] => 68
[19] => 72
[20] => 76
[21] => 68
[22] => 55
[23] => 67
[24] => 65
[25] => 75
[26] => 70
[27] => 71
[28] => 65
[29] => 40
)
[count] => Array
(
[24] => 1
[40] => 1
[44] => 1
[47] => 1
[55] => 1
[63] => 1
[65] => 2
[67] => 3
[68] => 2
[69] => 1
[70] => 2
[71] => 1
[72] => 2
[73] => 2
[74] => 1
[75] => 2
[76] => 4
[77] => 1
[85] => 1
)
)

