2016-07-29 32 views
-1

得到7个随机数字,我有以下代码:如何从列表

public static void main(String[] args) { 
    ArrayList<Integer> list1 = new ArrayList<Integer>(); 
    list1.add(10); 
    list1.add(8); 
    list1.add(5); 
    list1.add(3); 
    list1.add(9); 
    list1.add(2); 

    Random e = new Random(); 

    ArrayList<Integer> list2 = new ArrayList<Integer>(); 
    list2.add(50); 
    list2.add(18); 
    list2.add(44); 
    list2.add(4); 
    list2.add(23); 
    list2.add(37); 
    list2.add(38); 
    list2.add(26); 
    list2.add(25); 
    list2.add(10); 
    list2.add(30); 
    list2.add(49); 
    list2.add(14); 
    list2.add(29); 
    list2.add(42); 
    list2.add(5); 
    list2.add(11); 
    list2.add(21); 
    list2.add(79); 
    list2.add(15); 
    list2.add(17); 
    list2.add(24); 
    list2.add(1); 
    list2.add(13); 
    list2.add(45); 
    list2.add(6); 
    list2.add(27); 

    Random n = new Random(); 

    System.out.println(list1.get(n.nextInt(list1.size() - 1))); 
    System.out.println(list2.get(n.nextInt(list.size() - 1))); 

} 

我如何得到列表1 2张随机数(不重复),并从列表2 5张随机数(不重复)在相同无需运行代码7次即可获得我需要的7个数字

+2

使用Fisher Yates将清单进行清理并取出您想要的第一个N。 – Zong

+0

我投票“不清楚你在问什么”,因为list1不包含重复项,所以... – 2016-07-29 21:45:07

+1

请注意,有一个['Collections.shuffle()'](http://docs.oracle.com/javase/ 6/docs/api/java/util/Collections.html#shuffle%28java.util.List,%20java.util.Random%29)可用。无需推出自己的洗牌。 –

回答

1

每当您从列表中获取一个随机值时,请删除该元素。

如果需要,创建列表的副本保存原始数据


public int[] getRandomData(ArrayList<Integer> list, int count) { 
    int[] result = new int[count]; 
    while (count > 0 && list.size() > 0) { 
     int index = (int) (Math.random() * list.size()); 
     result[count - 1] = list.get(index); 
     list.remove(index); 
     count--; 
    } 
    return result; 
} 

被称为:

int[] stuffFromList1 = getRandomData(list1, 2); 
int[] stuffFromList2 = getRandomData(list2, 5); 
+1

谢谢。经过一些调整,我的代码工作。再次感谢 –

+0

这是一个O(nk)解决方案,当它可以通过在O(n + k)中洗牌完成。 – Zong

1

如果洗牌列表,然后你不需要使用随机类,因为Collection.shuffle会为你做...

例如:

public static void main(String[] args) { 
    List<Integer> list1 = new ArrayList<>(); 
    list1.addAll(Arrays.asList(new Integer[] { 8, 5, 3, 9, 2 })); 

    List<Integer> list2 = new ArrayList<>(); 
    list2.addAll(Arrays.asList(new Integer[] { 50, 18, 44, 4, 23, 37, 38, 26, 25, 10, 30, 49, 14, 29, 42, 5, 11, 21, 
     79, 15, 17, 24, 1, 13, 45, 6, 27, })); 
    Set<Integer> randomlist1 = new HashSet<>(); 
    Set<Integer> randomlist2 = new HashSet<>(); 
    populate(list1, randomlist1, 1); 
    populate(list2, randomlist2, 5); 
    System.out.println(randomlist1); 
    System.out.println(randomlist2); 
    } 

    private static void populate(List<Integer> list1, Set<Integer> randomlist1, int i) { 
    while (randomlist1.size() < i) { 
     Collections.shuffle(list1); 
     randomlist1.add(list1.get(0)); 
    } 
    } 
+2

这里的问题在于,这段代码可能会产生重复的内容,这是OP试图避免的。我的建议是将洗牌移出循环,并采取第一个“我”元素 – Jeeter

+0

非常感谢。该代码完美工作。非常感谢 –