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

举报
仙士可 发表于 2023/06/14 11:41:35 2023/06/14
【摘要】 主要原理是,将数组从大到小排序,数组1先取数取第一个,数组2第2取第2个,以此类推取完第一次数组之后,判断下数组1,数组2,进行一次排序,将数据最大的排前面(理论上来说,数组1数据最大,因为从大到小排序)当数组1是最大时,让数组1取倒数第一个值(最小值),数组2取倒数第2个值,以此类推这时候,数组1取得是最小,数组2取的是第二小,会让总数开始慢慢的接近,以此类推下面是一个n个数字分2组的实例...

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。