2016-07-29 49 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

非常感謝。該代碼完美工作。非常感謝 –