php关于数组n个随机数分成x组,使每组值相近的算法
温馨提示:
本文最后更新于 2018年02月25日,已超过 2,526 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
主要原理是,将数组从大到小排序,数组1先取数取第一个,数组2第2取第2个,以此类推
取完第一次数组之后,判断下数组1,数组2,进行一次排序,将数据最大的排前面(理论上来说,数组1数据最大,因为从大到小排序)
当数组1是最大时,让数组1取倒数第一个值(最小值),数组2取倒数第2个值,以此类推
这时候,数组1取得是最小,数组2取的是第二小,会让总数开始慢慢的接近,以此类推
下面是一个n个数字分2组的实例代码,分x组的可以自己写咯
<?php
function group_arr($arr_count, $max_num)
{
$arr = array();
for ($i = 0; $i < $arr_count; $i++) {
$arr[] = mt_rand(0, $max_num);
}
rsort($arr);
//var_dump($arr);
//从大到小排序一下
$total = array_sum($arr);
//var_dump($total);
$arr1 = array();
$arr2 = array();
$arr1_sum = 0;
$arr2_sum = 0;
$mean = $total / 2;//平均数
$arr_arr = $arr;
for ($i = 0; $i < $arr_count / 2; $i++) {
// var_dump($arr_arr);
if ($arr1_sum > $arr2_sum) {
$arr1_sum += $arr1[] = $arr_arr[count($arr_arr)-1];
array_splice($arr_arr,-1,1);//数组删除元素重排
$arr2_sum += $arr2[] = $arr_arr[count($arr_arr)-1];
array_splice($arr_arr,-1,1);//数组重排
} else {
$arr1_sum += $arr1[] = $arr_arr[0];
array_splice($arr_arr,0,1);//数组重排
$arr2_sum += $arr2[] = $arr_arr[0];
array_splice($arr_arr,0,1);//数组重排
}
}
echo '<br>数组:' . json_encode($arr);
echo '<br>总数:' . array_sum($arr);
echo '<br>arr1数组:' . json_encode($arr1);
echo '<br>arr1:' . array_sum($arr1);
echo '<br>arr2数组:' . json_encode($arr2);
echo '<br>arr2:' . array_sum($arr2);
echo '<br>arr总数:' .( array_sum($arr1)+array_sum($arr2));
}
group_arr(10, 100);
注意,这个算法思路取到的不一定是最接近的值,只能说是相对接近并且数字越多精度越高,以下是10个100随机数分2组的测试图
正文到此结束
- 本文标签: 算法 编程语言
- 本文链接: https://www.php20.cn/article/113
- 版权声明: 本文由仙士可原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权