2015-02-07 46 views
4
int[] drawNumbers = new int[10];//Array With 10 Random Numbers USED for DRAWN NUMBERS 
String x = "Drawn Numbers: "; 
List<Ticket> ticketWon ; 

do{ 
    //GENERATING 10 Random Numbers 
    for (int i = 0; i <= drawNumbers.length -1 ; i++) { 
      Random r = new Random(); 
      drawNumbers[i] = r.nextInt(99) + 1; 
      x += drawNumbers[i] + " "; 
    } 
} 

我試圖生成10個隨機數字,必須隨機生成並且唯一。我的問題是,使用Random r = new Random()有時會顯示覆制的數字。我如何從範圍1到99生成10個隨機數字而無需複製?生成隨機數字,但必須使用唯一編號生成而不進行重複

問題是針對彩票系統

我想用Collection.Shuffle但我不認爲它肯定應該如何實現。

+0

一種方法是把'Integer's在'Set',當一套大小爲10,結束'do while'循環。沒有'for'循環需要。 – Voicu 2015-02-07 17:17:44

+0

Aaahh,但是你怎麼知道重複不是巧合的隨機性? :-)。更嚴重的是,你應該真的在尋找一個密碼安全的隨機數發生器,而不是簡單的隨機數。 – 2015-02-07 17:18:47

+0

即SecureRandom ...不是隨機的 – 2015-02-07 17:20:22

回答

5

這是實現所需結果的另一種方法。我們填充值的列表1到99然後,我們改組列表和搶前10個值:

public static void main(String[] args) { 
    ArrayList<Integer> list = new ArrayList<Integer>(); 
    for (int i=1; i<100; i++) { 
     list.add(new Integer(i)); 
    } 
    Collections.shuffle(list); 
    for (int i=0; i<10; i++) { 
     System.out.println(list.get(i)); 
    } 
} 

您將不必導入/直接處理Random,這是一個加號。然而,正如@Voicu指出(在評論),shuffle確實利用隨機:

public static void shuffle(List<?> list) { 
    if (r == null) { 
     r = new Random(); 
    } 
    shuffle(list, r); 
} 
private static Random r; 
+0

雖然我喜歡這個答案(+1),但你仍然在後臺使用'Random'(通過調用'shuffle'方法)。這裏的代碼:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.shuffle%28java.util.List%29 – Voicu 2015-02-07 17:36:07

+0

@Voicu很好的一點。我從來沒有真正看過'shuffle',但是我會編輯我的回答 – gudthing 2015-02-07 17:40:57

+1

+1,不過,只有當你的範圍(1-99)相對較小時,這個效果纔會很好。如果你想在列表中得到結果,list.subList(0,10)'會取前10個數字。 – 2015-02-07 17:43:16

0

使用list會更容易,因此您可以檢查它是否已經包含該號碼,如果是,則重新生成。

List<Integer> drawNumbers = new ArrayList<Integer>(); 
Random r = new Random(); 
int newNumber = -1; 
do 
{ 
    newNumber = r.nextInt(99) + 1; 
} while(drawNumbers.contains(newNumber); //Make sure the number is not already in the list. 

然後把它放在一個循環中重複10次。

1

我會生成隨機數並將它們保存到Set,直到我得到10個數字。然後從中創建一個列表,隨機播放它,然後從中獲取數字。

final int NUMBERS_TO_DRAW = 10; 
Random r = new Random(); 

// Generate NUMBERS_TO_DRAW random numbers 
Set<Integer> randoms = new HashSet<>(); 
while (randoms.size() < NUMBERS_TO_DRAW) { 
    randoms.add(r.nextInt(99) + 1); 
} 

// Now shuffle them: 
List<Integer> shuffledRandom = new ArrayList<>(randoms); 
Collections.shuffle(shuffledRandom); 

編輯:
作爲@MarkPeters注意到在評論中,使用LinkedHashSet將不再需要洗牌:

final int NUMBERS_TO_DRAW = 10; 
Random r = new Random(); 

// Generate NUMBERS_TO_DRAW random numbers 
LinkedHashSet<Integer> randoms = new LinkedHashSet<>(); 
while (randoms.size() < NUMBERS_TO_DRAW) { 
    randoms.add(r.nextInt(99) + 1); 
} 
+0

使用LinkedHashSet比使用列表重新洗牌更容易最後。 – 2015-02-07 17:26:18

+0

@MarkPeters同意 - 這是更清潔!我編輯了我的答案,包括此(當然有適當的歸屬) – Mureinik 2015-02-07 17:26:33

+0

看起來不錯;這是當您將99更改爲'Integer.MAX_INT'時唯一不會出現的提示。 – 2015-02-07 17:46:01

1

可以廣泛地看待這個問題具有編號的一副牌從1到99,你想選擇其中的10張。解決方法是,以編程方式創建該套牌,然後從該套牌中隨機選擇並從套牌中移除。

我們可以在甲板建模爲一個整數列表和填充從1條目清單99是這樣的:

List<Integer> deck = new ArrayList<Integer>(); 
for(int i=1; i<=99; i++){ 
    deck.add(i); 
} 

然後我們需要選擇0號卡之間的隨機卡(名單編號從0開始),並在列表中元素的個數:

int draw = r.nextRandom(deck.size()); 
Integer card = deck.remove(draw); 

並重復10次,做一些與「卡」(比方說,把它變成一個數組,或其他列表,或任何:

int drawNumbers = new int[10]; 
for(int co=0; co<10; co++){ 
    int draw = r.nextRandom(deck.size()); 
    Integer card = deck.remove(draw); 
    drawNumbers[co] = card; 
} 
+0

'List'是抽象的,不能被實例化。 – 2015-02-07 17:25:24

+0

是啊是啊...固定 – Prisoner 2015-02-07 17:27:06

+0

這是另一個偉大的替代一套。它適用於小型域名,但如果允許數字高達20億,則效果不佳。 – 2015-02-07 17:41:00

1

使用Set<Integer>

Set<Integer> set = new HashSet<Integer>(); 
int[] drawNumbers = new int[10]; 
Random r = new Random(); 
for(int i=0; i<10; i++) 
{ 
    drawNumbers[i] = r.nextInt(99) + 1; 
    while(set.contains(drawNumbers[i])) 
     drawNumbers[i] = r.nextInt(99) + 1; 
    set.add(drawNumbers[i]); 
} 
+0

您可以在這裏改進兩件事:1)do-while循環意味着您不必重複生成該數字的行,並且2)set.add()已經返回false,如果該數字已經存在在列表中,所以你不需要'contains'。只需測試對「add」的調用即可。 – 2015-02-07 17:37:29