主要原理是,将数组从大到小排序,数组1先取数取第一个,数组2第2取第2个,以此类推
取完第一次数组之后,判断下数组1,数组2,进行一次排序,将数据最大的排前面(理论上来说,数组1数据最大,因为从大到小排序)
当数组1是最大时,让数组1取倒数第一个值(最小值),数组2取倒数第2个值,以此类推
这时候,数组1取得是最小,数组2取的是第二小,会让总数开始慢慢的接近,以此类推
下面是一个n个数字分2组的实例代码,分x组的可以自己写咯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <?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); |
注意,这个算法思路取到的不一定是最接近的值,只能说是相对接近并且数字越多精度越高。
上一篇:
php一次性大量数据入库解决方法
友情提示:垃圾评论一律封号...