2013-07-08 61 views
0

好吧,目標是每行/每行產生6個隨機數。有x行(由用戶通過UserInput設置)。每行必須有唯一的編號(非重複的編號)。我很確定這些數字是獨一無二的,但我似乎無法讓它有多行,而且我無法弄清楚我的生活是什麼部分阻止了多行。爲什麼這不會創建多組隨機數?

package rtg; 

import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Random; 
import java.util.Set; 

public class Array { 

public static void main(String[] args) { 

    String name; 
    int noTickets; 
    int[] numbers = new int[6]; 
    Set<Integer> randomNumbers = new HashSet<>(); 
    Random rand = new Random(); 



    int ticketCount = 1; 



    System.out.println("Please input your name"); 
    name = UserInput.readString(); 
    System.out.println("Please input the number of tickets you want"); 
    noTickets = UserInput.readInt(); 
    System.out.println("___________________________________________\n___________________________________________"); 
    System.out.println("___________________________________________\n___________________________________________"); 


    System.out.println("Name: " +name+ "\nNumber of Tickets: " +noTickets+ "\nNumbers: "); 

    for (ticketCount = 1; ticketCount <= noTickets; ++ticketCount){ 

     while (randomNumbers.size() < 6) { 
      randomNumbers.add(rand.nextInt(50) + 1); 
     } 

     int i = 0; 
     for (Integer n : randomNumbers) { 
      numbers[i++] = n; 
     } 



     System.out.print(Arrays.toString(numbers) + "\n"); 
    } 

} 

}

編輯謝謝大家很多,我終於到了那裏,原來我把陣列在錯誤的地方(這是外面的for循環,從而只取得1組隨機數)現在修復它。下一個challange;有一個比較程序來掃描90多套6個唯一編號,並比較它們中的任何一個是否匹配不同的集合(每行/集> <)

回答

7

您可以東西隨機整數爲Set<Integer>,直到它有六大要素:

Set<Integer> randomNumbers = new HashSet<>(); 
Random rand = new Random(); 
while (randomNumbers.size() < 6) { 
    randomNumbers.add(rand.nextInt(50) + 1); 
} 

或者,您可以生成數1-50,洗牌他們,並挑選任何六大要素:

List<Integer> numbers = new ArrayList<>(50); // known capacity 
for (int i = 1; i <= 50; ++i) { numbers.add(i); } 
Collections.shuffle(numbers); 
List<Integer> sixRandomNumbers = numbers.subList(0, 6); 

第一種解決方案會在發生碰撞時進行額外的工作;這個額外的工作越多,所需的比例就越高。第二個是通過處理全部50個數字來完成額外的工作;額外的工作越多,所需的比例就越大。交叉點是一個有趣的問題。

編輯(回答編輯原始問題)使用上述方法之一生成六個不同的隨機數後,您需要將它們放入要使用的變量中。一種方式(比如,使用第一種方法)如下:

int[] numbers = new int[6]; 
Set<Integer> randomNumbers = new HashSet<>(); 
Random rand = new Random(); 
while (randomNumbers.size() < 6) { 
    randomNumbers.add(rand.nextInt(50) + 1); 
} 
System.out.println("Six random numbers: " + randomNumbers.toString()); 

// if you need them as an `int` array: 
int i = 0; 
for (Integer n : randomNumbers) { 
    numbers[i++] = n; 
} 

numbers陣列取代了你的變量number1,...,number6

+0

非常感謝。我認爲這已經排序(我會做更多的檢查,但目前爲止沒有重複)。只是一個快速的請求,是否有可能解釋Set 和HashSet實際上做了什麼? (我想知道以供將來參考:) 此外,稍有不同的問題,但相關的,如果我手動輸入一系列的6個數字(多行也),這將有可能使用此方法,檢查是否有任何號碼與另一個列表匹配(IE我把10,9,8,7,6,5放在一行上,1,2,3,4,5,6放在另一行上,並且想要檢查是否有任何數字匹配10,4,30,12 ,41,9等?) – NeoKuro

+0

Erm ...沒有工作。我在哪裏將這段代碼放在了興趣之外(我已經將它定位在字符串變量'name'的頂部) – NeoKuro

+0

@Josh - 什麼都不起作用? (您可以編輯您的問題,並在原始帖子下面張貼修改過的代碼,如果這是解釋仍然存在問題的必要條件)。關於您的第二個問題 - 我建議將其作爲新問題發佈。 –

3

使用數據類型允許您檢查int是否有已經被創建。例如,將它們添加到ArrayList<Integer>

ArrayList<Integer> numbers = new ArrayList<Integer>(); 
while(numbers.size() < 6) { 
    int num = rand.nextInt(50) + 1; 
    if(!numbers.contains(num)) { 
     numbers.add(num); 
    } 
} 

當然,作爲@sanbhat在評論中說,你可以使用一個Set<Integer>,避免if()條件完全循環。不過,我認爲這對於不知道Set API不會添加重複元素的初學者會更直觀。

+2

相反,您可以使用'Set ' – sanbhat

+0

完全是我正在建議的解決方案!喬希,請注意,一旦你遵循這個(正確的)解決方案,你將不得不記住列表包含'整數',而不是'int's。這將有所作爲! –

+0

@RussellUhl由於autounboxing等原因,它可能不會有太大的區別。 – asteri

0

保存排序列表或更高效地存儲一組先前選擇的值,並檢查當前選擇是否與之前選擇的值相同,如果先前選擇了該值,請再試一次。

0

如果你知道你的隨機數的有效範圍,如果該範圍的大小上沒有限制,一個簡單的算法將如下所示:

  • ,大小等於你的電話號碼範圍內創建一個數組
  • 連續填充您的數組中的數字
  • 在列表中循環遍歷任意數量的次數;生成是你的數組索引中的兩個僞隨機數,以及這些索引交換兩個元素

迭代完成後,你將不得不出現在唯一代表數字,都是你的號碼範圍內的數組隨機順序。這幾乎完全模擬了一次洗牌時發生的情況。

然後,您可以編寫一個簡單的方法,以便在每次調用數組時從數組中連續彈出數字。

該算法的一個優點是它可以實現爲一個基元數組,例如。 int [],而不需要Java Collections API。