从N个元素的集合中随机取m个元素的算法实现

Posted 张柯宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从N个元素的集合中随机取m个元素的算法实现相关的知识,希望对你有一定的参考价值。

最近有一个需求,比较简单,就是如标题所说的,从N个元素中随机取m个元素,当然这m个元素是不能存在重复的。本以为这么简单的需求,应该有现成的工具类来实现,但是几次查找居然没找到(有知道的可以推荐下哈^_^)。只好自己实现了下。

  自己的实现思路也不知道是不是有问题,或者还有没有更好的思路来实现,所以在这里贴出来,供有兴趣的猿友提提建议、找找问题,或者找到更好的实现思路。

  废话不多说,直接上代码(java实现)

技术分享
/**
     * 随机取num个从0到maxVal的整数。包括零,不包括maxValue
     * @param num
     * @param maxValue
     * @return
     */
    public static List<Integer> random(int num,int maxValue){
        if(num>maxValue ){
           num=maxValue;
        }
        if(num<0 || maxValue<0){
            throw new RuntimeException("num or maxValue must be greater than zero");
        }
        List<Integer> result = new ArrayList<Integer>(num);

        int[] tmpArray = new int[maxValue];
        for(int i=0;i<maxValue;i++){
            tmpArray[i]=i;
        }

        Random random = new Random();
        for(int i=0;i<num;i++){
            int index =  random.nextInt(maxValue-i);
            int tmpValue = tmpArray[index];
            result.add(tmpValue);
            int lastIndex = maxValue-i-1;
            if(index==lastIndex){
                continue;
            }else{
                tmpArray[index]=tmpArray[lastIndex];
            }

        }


        return result;
    }

以上是关于从N个元素的集合中随机取m个元素的算法实现的主要内容,如果未能解决你的问题,请参考以下文章

在n个元素中随机挑选k个不重复元素,该怎么选

[JAVA] - 高效的从 m 个元素中随机选中 n 个

JAVA从数组中选取N个数,使其和为M实现算法?

matlab中矩阵随机取几个元素赋值

[程序员代码面试指南]第9章-蓄水池算法

算法设计与分析: 2-8 集合划分问题