2016-03-01 40 views
-1
public class randomNumbers { 
public static void main(String args[]){ 
    int[] nums = new int[20]; 
    Random rn = new Random(); 
    int temp; 

    for(int i=0;i!=20;i++) { 
     temp=rn.nextInt(30)+1; 
     for(int j=0; j<i; j++) { 
      if(temp==nums[j]) { 
       j=0; 
       temp = rn.nextInt(30)+1; 
      } 

     } 
     temp = nums[i]; 
    } 

    for(int i=0; i!=20; i++) { 
     System.out.println(nums[i]); 
    } 
} 

這是我的程序代碼。但輸出全部爲零。第一個循環應運行20次並從1-30生成一個隨機int,然後嵌套循環應測試並查看它是否在數組中。如果爲true,則應創建一個新的temp,並將j設置爲0以再次檢查。如果沒有,那麼嵌套循環應該完成並且temp設置等於nums [i]。但就像我說的我的輸出全是零。從1-30創建20個不同的數字不重複

+0

您從不向nums數組項目分配任何東西。例如,你在哪裏看到'nums [i] =任何東西'?這不是一個編程問題,而是一個基本的邏輯問題:如果你從不將任何東西放入盒子,盒子仍然是空的,對吧? –

+0

'「...並且temp設置等於nums [i]」',如果它這樣做了,它所做的全部設置temp都等於0.要意識到這不會爲'nums [i]'分配任何東西。爲了給某個變量賦值,該變量必須位於賦值的**左側**,我認爲這是您誤解的主要原因之一。這是一個核心的Java概念,您將從Java課本和學習中學到最好的概念。 –

回答

1

使用集合,不重新發明輪子:

Set<Integer> mySet = new HashSet<Integer>(); 
Random rnd = new Random(); 
while (mySet.size() < 20) { 
    mySet.add(rnd.nextInt(30) + 1); 
} 
System.out.println(mySet); 

這將打印:

[3,4,5,6,9,10,11,12,14 ,15,17,16,20,23,22,24,27,26,29,30]


更新

另一種選擇通過@ user3745362

List<Integer> myList = new ArrayList<Integer>(); 
     for (int i = 0; i < 30; i++) { 
      myList.add(i + 1); 
     } 
     Collections.shuffle(myList); 
     System.out.println(myList.subList(0, 19)); //return a sublist from 0 to 19 

建議這將打印:

[15,17,24,29,3,18,22,5,13,8, 19,11,10,27,12,26,20,30,16]

+2

您也可以使用從1到30的連續數字填充ArrayList,對其進行隨機播放,然後取出前20個元素。無論哪種方式都很好。 – user3745362

相關問題