2016-12-14 62 views
4

我得到了一個數字池(例如{3,6,7,11,20}),我需要每個數字出現在我的收藏x次。如何從不相互關注的數字池中生成一個隨機數

我的解決方案是創建一個類,讓我們稱之爲「元素」,兩個整數(num,numOfAppearnces)。

我在arrayList中創建了一個「元素」池,然後生成一個介於0到list.size之間的隨機數,並獲得存儲在隨機索引中的數字。 當numOfAppearances減少到0時,我從列表中刪除了這個元素。

我的問題是,有沒有其他優雅的解決方案來產生隨機數,而不是從一個範圍?

+0

我建議 「搜索」 你問之前。 http://stackoverflow.com/questions/2019417/access-random-item-in-list –

+0

我會做類似於你的解決方案,但只是把它們放在一個數組中,並生成一個0-array.size之間的隨機數並使用它作爲索引。 – nesohc

+0

這個問題的「最佳」解決方案將取決於'x'的值。如果它很高,並且不同值的數量也很高,並且內存使用率是一個問題,那麼可能需要更高效的內存解決方案。否則,只需將所有數字(包括'x'副本)放入一個數組並將其混洗即可。 –

回答

6

是的,有很短的方法來實現你所描述的。

例如:

Integer[] arr = {3,6,7,11,20}; 
List<Integer> shuffled = new ArrayList<>(); 
for (Integer i : arr) 
    shuffled.addAll (Collections.nCopies(x,i)); // add i to your List x times 
Collections.shuffle(shuffled); // shuffle the List to get random order 

或者(如果你不想使用Collections.nCopies(x,i)):

Integer[] arr = {3,6,7,11,20}; 
List<Integer> shuffled = new ArrayList<>(); 
for (int j = 0; j < x; j++) 
    for (Integer i : arr) 
     shuffled.add (i); 
Collections.shuffle(shuffled); // shuffle the List to get random order 
0

這裏是簡單的Python程序

import random 
def genRNum(): 
    numlist = [3,6,7,11,20] 
    i = random.randrange(0,4) 
    RNum = numlist[i] 
    print(RNum) 

genRNum() 
0

另一種最簡單的方法是使用Windows PowerShell

獲取-隨機3,6,7,11,20

That't它

+1

從OP:'我需要每個號碼出現在我的收藏x次'。你沒有解決這個要求。 –