2016-02-05 90 views
-4

我想讓這段代碼運行時沒有重複,但是我沒有成功研究這個區域。沒有重複的隨機元素生成Java

它是我正在做的問題的開始,它會要求用戶輸入缺少的元素。然而,當我產生隨機元素我得到重複

import java.util.Random; 

public class QuestionOneA2 { 

    public static void main(String[] args) { 

     String[] fruit = {"orange", "apple", "pear", "bannana", "strawberry", "mango"}; 
     Random numberGenerator = new Random(); 

     for (int i = 0; i < 5; i++) { 
      int nextRandom = numberGenerator.nextInt(6); 
      System.out.println(fruit[nextRandom]); 
     } 


    } 

} 
+1

所以你試圖從一組6項中選擇5個隨機項目? –

+1

將'Collections.shuffle()'應用於序列填充列表 –

+0

是的我試圖從6中隨機選擇5而沒有重複 – StudentCoder

回答

1

當你生成一個隨機數,我建議將它添加到一個數組。

然後,當你生成你的下一個號碼,做一些搜索(谷歌有效的東西),以檢查該數字是否已經在數組中,因此,已被使用。

如果是,則生成一個新的,如果沒有,則使用它。

你可以通過在while循環中嵌套它來做到這一點。

雖然從我的問題中可以看出,使用ArrayList創建水果數組的副本會更好,然後當您生成一個隨機數來選擇水果時,只需從該數組中刪除該水果即可這個新的列表和遞減你正在生成的隨機數的範圍。

+0

二進制搜索只能在排序的數組 –

+0

@SashaSalauyou正確,不知道我在想什麼哈哈! – James

1

您可以考慮許多不同的方法,具體取決於算法應該有多靈活。

從6的列表中取5個隨機元素,與您不選擇的列表中的選擇1元素相同。這是一個非常不靈活,但很容易。

另一種方法可能是從列表中刪除元素,並減少最大隨機數。在這個原因,我會建議不要使用String[]

+0

將它存儲在字符串中是我試圖執行的操作之一 – StudentCoder

-1
fruit.remove(fruit[nextRandom]); 

也許,是否刪除子方法?

+2

數組沒有'remove'方法。 –

0

您的陣列複製到List<String>,然後將它洗,然後隨便挑元素逐一:

List<String> copy = new ArrayList<>(Arrays.asList(fruit)); 
Collections.shuffle(copy); 
for (String f : copy) 
    System.out.println(f); 
0

如果我理解正確的話,那麼你要選擇N-1個隨機從列表中的元素n個元素。如果是,那麼我建議隨機選擇一個,並採取所有其他。

Arrays.shuffle(fruit); 
int notThis = numberGenerator.nextInt(6); 
for(int i = 0; i < fruit.length; i++) 
    if(i!=notThis) System.out.println(fruit[i]); 
+0

如果他會這樣做,那麼他可能會一次又一次地得到相同的訂單。例如,如果'apple'被排除,那麼順序將是'OPBSM',如果'pear'被排除,那麼順序將是'OABSM'。在這兩種情況下,「Orage」的順序都是固定的,即0. – user2004685

+1

然後先將水果洗牌,然後解決此問題:在打印結果之前必須添加Arrays.shuffle(水果)。我將這添加到我的解決方案 – thorshammer

+0

是的,'洗牌'會做到這一點。 – user2004685

1

您可以使用Set來驗證隨機生成的數字是否重複。您只需繼續生成randomNumber,直到找到唯一的隨機數,然後將其添加到Set以防止重複。

下面是一個簡單的代碼片段:

public static void main(String[] args) { 
    String[] fruit = {"orange", "apple", "pear", "bannana", "strawberry", "mango"}; 
     Random numberGenerator = new Random(); 
     /* Generate A Random Number */ 
     int nextRandom = numberGenerator.nextInt(6); 
     Set<Integer> validate = new HashSet<>(); 
     /* Add First Randomly Genrated Number To Set */ 
     validate.add(nextRandom); 
     for (int i = 0; i < 5; i++) { 
      /* Generate Randoms Till You Find A Unique Random Number */ 
      while(validate.contains(nextRandom)) { 
       nextRandom = numberGenerator.nextInt(6); 
      } 
      /* Add Newly Found Random Number To Validate */ 
      validate.add(nextRandom); 
      System.out.println(fruit[nextRandom]); 
     } 
} 

輸出:

mango 
apple 
strawberry 
pear 
orange 
0

可以INT包裝成 '基於整數' 並將其添加設置。 Set不保存重複,因此只有唯一的值。所以然後檢查一個Set是否已經給Set.contains(Integer)賦予Integer。

0

我個人的解決方案:

private static int[] randomIndexes(int len) { 
    int[] indexes = new int[len]; 
    for (int i = 0; i < len; i++) { 
     indexes[i] = i; 
    } 
    for (int i = len - 1, j, t; i > 0; i--) { 
     j = RANDOM.nextInt(i); 
     t = indexes[j]; 
     indexes[j] = indexes[i]; 
     indexes[i] = t; 
    } 
    return indexes; 
} 

看到它在行動:https://gist.github.com/GautierLevert/a6881cff798e5f53b3fb

0

我認爲它會使用一個ArrayList,並控制隨機數的產生如下圖所示容易。

import java.util.Random; 

public class QuestionOneA2 { 

     public static void main(String[] args) { 

     List<String> fruits = new ArrayList<>(); 

     fruits.add("orange"); 
     fruits.add("apple"); 
     fruits.add("pear"); 
     fruits.add("bannana"); 
     fruits.add("strawberry"); 
     fruits.add("mango"); 

     Random numberGenerator = new Random(); 
     int nextRandom; 

     for (int i = 0; i < 6 ; i++) { 
      nextRandom = numberGenerator.nextInt(6 - i); 
      System.out.println(fruits.get(nextRandom)); 
      fruits.remove(nextRandom); 
     } 
     } 

}