专栏首页仙士可博客php关于数组n个随机数分成x组,使每组值相近的算法

php关于数组n个随机数分成x组,使每组值相近的算法

主要原理是,将数组从大到小排序,数组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组的测试图

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • php实现根据概率配置随机抽奖

    本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

    仙士可
  • C语言实现插入排序

    插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应...

    仙士可
  • jq使用splice删除数组元素出错的解决方法

    splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。

    仙士可
  • [图解] 快速排序

    经典快速排序总是指定数组或者某部分的最后一个元素作为基准值,随机快速排序指定数组或者某一部分中的随机值作为基准值。

    CoderJed
  • 排序之直接插入排序

    本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此;一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都...

  • 快速排序法,冒泡排序法

    windseek
  • 快速排序

    程序员不务正业
  • 数据结构与算法—选择排序(Java实现)

    IT故事会
  • 排序算法之选择排序-java版

    选择排序类似于冒泡排序,均属于内排,也可以看做是对冒泡排序的优化。因为冒泡排序是比较相邻的两个值,然后直接交换。而选择排序是找到一个最大值或者最小值之后,再进行...

    shengjk1
  • JavaScript数组排序总结

    将数组中的相邻两个元素进行比较,将比较大(较小)的数通过两两比较移动到数组末尾(开始),执行一遍内层循环,确定一个最大(最小)的数,外层循环从数组末尾(开始)遍...

    用户4831957

扫码关注云+社区

领取腾讯云代金券