2016-10-23 16 views
0

我想創建一個隨機數生成器產生抽獎號碼的方法。有兩組數字。第一組應該有五個不同的數字,按照排序順序顯示,範圍爲1-56。第二組由一個範圍爲1-46的單個數字組成。當我運行程序時,組1總是開始兩個連續的零,即使我試圖以不允許組1有零或重複數字的方式編寫代碼。起初我認爲這個問題必須與隨機數生成器有關,所以我嘗試在NetBeans中調試項目。當我通過代碼行時,我可以看到賦值給n的值,這是保存隨機生成器生成的數字的變量。 n的值是54,50,11,49和28.在該程序中,n的值被放入一個有序數組中。所以輸出組一個本來應該是11,28,49,50,54,而是它是0,0,11,28,49爲什麼我的程序輸出總是以兩個連續的零開始,即使我寫了一個不產生零或重複數字的代碼?

這裏是我的代碼:

public static void MakeTickets(){ 

    int [] Group1= new int [5]; 

    int Group2; 

    int n; 

    Random rand= new Random(); 

    for (int j=0 ; j<5; j++){ 
     //Here, I try to make sure that the range for n is 1-56 

     n= rand.nextInt(55)+1; 

     //Here, I try to make sure that a number isn't put into the group one 
     //array more than once 

     while (Arrays.binarySearch(Group1, n)>=0){ 
      n= rand.nextInt(55)+1; 
     } 


     Group1[j]=n; 

     Arrays.sort(Group1); 
    } 

    Random r= new Random(); 

    int num= r.nextInt(45)+1; 

    Group2=num; 

    System.out.print("Here is your ticket: Group One= "); 

    for(int number: Group1){ 
     if (number==Group1[4]){ 
     System.out.print(number); 
     } else { 
      System.out.print(number+", "); 
     } 
    } 

    System.out.println(" Group Two= "+Group2); 
} 

這裏是輸出:

Here is your ticket: Group One= 0, 0, 33, 45, 50 Group Two= 40 

我試過使用ThreadLocalRandom來代替,但我仍然有同樣的問題。有誰知道我做錯了什麼?任何和所有的建議非常感謝。

回答

2

Arrays.sort(Group1);正在引發該問題。

我認爲Arrays.sort(Group1);應放置在第一個for循環之後(在生成Group1值後)。

當前值添加每個值後排序。

最初數組中的值是0 0 0 0 0

第一迭代

生成所述第一數

n= rand.nextInt(55)+1; //lets assume the generated value is 43 

的後,陣列變得43 0 0 0 0

調用sort後,

Arrays.sort(Group1); 

陣列變得0 0 0 0 43

第二迭代。

產生第二數目之後

n= rand.nextInt(55)+1; //lets assume the generated value is 22 

的,陣列變得0 22 0 0 43

調用sort後,

Arrays.sort(Group1); 

陣列變得0 0 0 22 43

第三迭代

產生第三數目之後

n= rand.nextInt(55)+1; //lets assume the generated value is 31 

的,陣列變得0 0 31 22 43

調用sort後,

Arrays.sort(Group1); 

陣列變得0 0 22 31 43

第4次和第5次迭代不會更改數組中的前兩個值。這樣,前兩個數字就會被卡住爲0,這就解釋了你的結果。

+0

雖然,將循環移出循環會導致用於防止重複失敗的二進制搜索。在索引'0'而不是'j'中插入可以工作,或者既可以移動排序又可以切換到線性搜索。 – Douglas

0

您無法在未排序的陣列上使用Arrays.binarySearch。在這種情況下,這種操作的結果是不可預測的。

Sort將全部零移動到數組的開頭。但是你不會重寫它們(因爲j正在遞增)。

0

我相信問題是int數組每次都被排序。 int數組的初始值爲0.通過在每次更改需要插入新隨機數的位置時對數組進行排序。所以有時候你會不小心改寫隨機生成的數字而不是0。

也許不是使用BinarySearch,而是使用BinarySearch,它只需要使用包含並排除排序,直到生成所有隨機數。我不知道確切的語法,因爲我已經3年沒有用Java編碼了,但是你可以做類似Arrays.asList(Group1).contains(n)的東西。所以......

for (int j = 0; j < 5; j++) { 
    //Here, I try to make sure that the range for n is 1-56 

    n= rand.nextInt(55)+1; 

    while (Arrays.asList(Group1).contains(n)) { 
     n = rand.nextInt(55)+1; 
    } 

    Group1[j] = n; 
} 

Arrays.sort(Group1); 
0

你好,據我所知,有零位的情況,一般是默認值零分配是編譯器,你沒有初始化這個變量。

+1

這並不能解釋爲什麼變量沒有被初始化。 –

相關問題