从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;
    }
时间: 2024-10-17 16:13:31

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

python random 从集合中随机选择元素

使用python random模块的choice方法随机选择某个元素 from random import choice foo = ['a', 'b', 'c', 'd', 'e'] print (choice(foo)) 使用python random模块的sample函数从列表中随机选择一组元素 list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] slice = random.sample(list, 5) #从list中随机获取5个元素,作为一个片断返回 pri

从一个数组中随机取出一定数量元素组成新数组

/** * 从一个数组中随机取出一定数量元素组成新数组 * @param array 一个String类型的数组 * @param number需要取出元素的数量 * @return 一个随机的数组 * @throws NullPointerException原数组不能为空 *@throws ArrayIndexOutOfBoundsException新数组长度应不大于原数组的长度 */ public static String[]  getRandomArray(String[] array,

java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据封装进人对象. 2,定义容器,将人存入. 3,取出. List集合判断元素是否相同,依据是元素的equals方法. */ class Person { private String name; private int age; Person(String name,int age) { this.n

使用jQuery匹配文档中所有的li元素,返回一个jQuery对象,然后通过数组下标的方式读取jQuery集合中第1个DOM元素,此时返回的是DOM对象,然后调用DOM属性innerHTML,读取该元素 包含的文本信息

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head> <meta htt

sampleSize - 从数组中随机获取 n 个元素

从 array 中获取 n 个唯一键随机元素. 使用Fisher-Yates算法 对数组进行打乱. 使用 Array.slice() 获取第一个 n 元素. 省略第二个参数,n 从数组中随机取得 1 个元素. const sampleSize = ([...arr], n = 1) => { let m = arr.length; while (m) { const i = Math.floor(Math.random() * m--); [arr[m], arr[i]] = [arr[i],

not(expr|ele|fn)从匹配元素的集合中删除与指定表达式匹配的元素

not(expr|ele|fn) 概述 从匹配元素的集合中删除与指定表达式匹配的元素 参数 exprStringV1.0 一个选择器字符串.深圳dd马达 elementDOMElementV1.0 一个DOM元素 function(index)FunctionV1.4 一个用来检查集合中每个元素的函数.this是当前的元素. 示例 描述: 从p元素中删除带有 select 的ID的元素 HTML 代码: <p>Hello</p><p id="selected&quo

STL系列十一 随机三趣题——随机重排,文件中随机取一行,生成N个随机数

本文将介绍三个有趣的随机问题,分别是随机重新排列.从文件中随机取一行数据.生成N个随机数. 一.随机重新排列 将一个序列打乱并对其进行随机的重新排列,关键在于每种序列的被选择概率要一样,不然有失"公平".现在让我们来寻找如何保证每种序列被选择的概率一样大的算法. 首先假设这个数组只有二个元素,设数组a为{1, 2},显然这个数组只有二种可能的排列,要么是{1,2}要么是{2,1}.很容易想到一种方法--只要第二个元素有50%的概率与第一个元素交换即可.用代码表现下: if (rand(

从SQLSERVER/MYSQL数据库中随机取一条或者N条记录

原文:从SQLSERVER/MYSQL数据库中随机取一条或者N条记录 从SQLSERVER/MYSQL数据库中随机取一条或者N条记录 很多人都知道使用rand()函数但是怎麽使用可能不是每个人都知道 建立测试表 USE [sss] GO CREATE TABLE RANDTEST(ID INT DEFAULT RAND()*100,NAME NVARCHAR(200) DEFAULT 'nihao') GO CREATE INDEX IX_RANDTEST_ID ON RANDTEST(ID)

在至少3个互异的整数中任取一个“常规元素”

问题: 从 n>=3 个互异整数中,除最大.最小者以外,任取一个“常规元素”. 解决: ordinaryElement(s[], n) 在 s 中任取三个元素,不失一般性就去前三个元素: //这3个元素亦必互异 通过比较,输出其中大小居中的元素: //这个元素必然就是“常规元素” 问题简单,写下来的目的是为了告诫自己: 永远重视思考的过程,永远不要把简单的问题想复杂,永远追求“大道至简”. From : <数据结构>,邓俊辉