请问如何随机取list里的某几个值,但值是不能相同的?假若list里有8个数字,我要随机取5个,但不能有重复的。

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【zhangshenqiu】截止到2008-07-14 12:02:16的历史汇总数据(不包括此帖):
    发帖的总数量:13                       发帖的总分数:620                      每贴平均分数:47                       
    回帖的总数量:68                       得分贴总数量:9                        回帖的得分率:13%                      
    结贴的总数量:2                        结贴的总分数:160                      
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:11                       未结的总分数:460                      
    结贴的百分比:15.38 %               结分的百分比:25.81 %                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
      

  2.   

    比较一下  重复的话就不拿  继续下一次再说你List里有8个数  你要拿5个出来  还不能重复你那8个数如果是  1 1 1 1 1 1 1 1   的话怎么办
      

  3.   

    最直接的方法是:
    新建一个list,将原有list全部复制。
    在新list中随机取出数,取出之后立刻list.remove()
    然后呢,就能够保证每次取出来肯定不一样了。
      

  4.   

    可以考虑下先shuffer(Collenctions的一个方法,好像是),然后取前五个
      

  5.   

    import java.util.Arrays;
    import java.util.Random;/**
     * <code>RandomUtil</code> - Random Tool Class.
     * @author SageZk
     * @version 1.0
     */
    public class RandomUtil {    private RandomUtil() {}    private static Random rnd = null;    /**
         * 初始化随机数发生器。
         */
        private static void initRnd() {
            if (rnd == null) rnd = new Random();
        }    /**
         * 计算并返回无重复值的以 <code>min</code> 为下限 <code>max</code> 为上限的随机整数数组。
         * @param min 随机整数下限(包含)
         * @param max 随机整数上限(包含)
         * @param len 结果数组长度
         * @return 结果数组
         */
        public static int[] getLotteryArray(int min, int max, int len) {
            //参数校验及性能优化
            if (len < 0) return null;  //长度小于 0 的数组不存在
            if (len == 0) return new int[0];  //返回长度为 0 的数组
            if (min > max) {  //校正参数 min max
                int t = min;
                min = max;
                max = t;
            }
            final int LEN = max - min + 1;  //种子个数
            if (len > LEN) return null;  //如果出现 35 选 36 的情况就返回 null
            //计算无重复值随机数组
            initRnd();  //初始化随机数发生器
            int[] seed = new int[LEN];  //种子数组
            for (int i = 0, n = min; i < LEN;) seed[i++] = n++;  //初始化种子数组
            for (int i = 0, j = 0, t = 0; i < len; ++i) {
                j = rnd.nextInt(LEN - i) + i;
                t = seed[i];
                seed[i] = seed[j];
                seed[j] = t;
            }
            return Arrays.copyOf(seed, len);  //注意:copyOf 需要 JRE1.6
        }    //Unit Testing
        public static void main(String[] args) {
            final int N = 10000;  //测试次数
            for (int i = 0; i < N; ++i) {
                int[] la = RandomUtil.getLotteryArray(1, 35, 7);
                if (la == null) continue;
                for (int v : la) System.out.printf("%0$02d ", v);
                System.out.println();
            }
        }}List<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    //...
    int[] idx = RandomUtil.getLotteryArray(0, list.size() - 1, 6 /*取几个*/);
    Integer is = new Integer[idx.length];
    int j = 0;
    for (i : idx) {
        is[j++] = list.get(i);
    }
      

  6.   


            List<Integer> list = new ArrayList<Integer>();
            Set<Integer> set = new HashSet<Integer>();
            Random rand = new Random();        list.add(8);
            list.add(9);
            list.add(5);
            list.add(4);
            list.add(5);
            list.add(9);
            list.add(0);
            list.add(3);        while(set.size() < 5)
            {
                set.add(list.get(rand.nextInt(list.size())));
            }        for(Integer num: set)
            {
                System.out.println(num);
            }
      

  7.   

    当你生成随机数到ArrayList的时候换成HashSet
    HashSet的特性就是值唯一。这样取出的时候就不用判断了。
      

  8.   

    List<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    //...
    int[] idx = RandomUtil.getLotteryArray(0, list.size() - 1, 6 /*取几个*/);
    Integer is = new Integer[idx.length];
    int j = 0;
    for (i : idx) {
        is[j++] = list.get(i);
    }
      

  9.   

    List<Integer> list = new ArrayList<Integer>();
            Set<Integer> set = new HashSet<Integer>();
            Random rand = new Random();        list.add(8);
            list.add(9);
            list.add(5);
            list.add(4);
            list.add(5);
            list.add(9);
            list.add(0);
            list.add(3);        while(set.size() < 5)
            {
                set.add(list.get(rand.nextInt(list.size())));
            }        for(Integer num: set)
            {
                System.out.println(num);
            }