您的位置:首页 > 编程语言 > PHP开发

随机生成红包金额算法

2016-12-07 00:00 246 查看
/**
* 随机生成红包金额
* @param $n 红包个数
* @param $sum  总金额 整数
* @param $index_max  最大金额在数组中索引
* @param $error
* @return array|false
*/
public static function GenRandRePacketsData($n,$sum,&$index_max,&$error)
{
//$n = 20;
//$sum = 300;
if($sum < $n)
{
$error = '金额总数不能小于红包个数'; //$error = '金额总数必须大于红包个数';
return false;
}
if($n > 50)
{
$error = '红包数量不能大于50';
return false;
}
//$sum = $sum * 100;//转为分
$rst = [];
$ave = intval($sum/$n);  // 金额除去红包个数 平均值 test:3/3 = 1
$one_rst = rand(1,$ave); // 随机取1到平均值的数
$subSum = $one_rst;  // 1
//$rst[] = $one_rst/100;
$rst[] = $one_rst; // $rst = ['0'=>1];
$index_min = 0;
$index_max = 0;
$min = $one_rst; // 1
$max = $one_rst; // 1

for($i = 2; $i <= $n; $i ++)
{
$ave = intval(($sum - $subSum)/($n - $i + 1)); // 1
$one_rst = rand(1,$ave); // 1
if($min > $one_rst) // 1 > 1
{
$min = $one_rst;
$index_min = $i -1;
}
if($max < $one_rst) // 1 < 1
{
$max = $one_rst;
$index_max = $i -1;
}
//$rst[] = $one_rst/100;
$rst[] = $one_rst;
$subSum += $one_rst; // 1
}
$left = $sum - $subSum;

if($left > 0)
{
//$rst[$index_min] = ($rst[$index_min] + $left/100);
$rst[$index_min] = ($rst[$index_min] + $left);
if($rst[$index_min] > $max)
{
$max = $rst[$index_min];
$index_max = $index_min;
}
}
//检测重复的最大值处理,确保最大值唯一
/*for($i =0; $i < $n; $i++)
{
if($rst[$i] === $max && $i !== $index_max)
{
$one_rst = $rst[$i] -1;
$rst[$i] = $one_rst;
$rst[$index_max] = $max + 1;
break;
}
}*/

//重新乱序
shuffle($rst);
//查找最大值
$index_max = 0;
$max = $rst[0];
for($i =1; $i < $n; $i ++)
{
if($rst[$i]> $max)
{
$index_max = $i;
$max = $rst[$i];
}
}
return $rst;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PHP 红包 算法