2010-12-08 85 views
0
If the number range is 0 - 10. I would like to generate the following numbers 

e.g. 

unique 5 numbers [3, 8, 5, 1, 9] 
unique 3 numbers [2, 6, 5] 
5 numbers of which 2 numbers occur twice [2, 3, 2, 6, 3] 
7 numbers of which 2 numbers occur twice [2, 5, 9, 2, 7, 5, 3] (Here 2, 5 occur twice) 
5 numbers of which 1 number occur thrice [2, 3, 8, 3, 3] (Here 3 occurs twice) 
7 numbers of which 1 number occur thrice and 1 number occurs twice [1, 5, 9, 1, 1, 5, 3] (Here 1 occurs thrice, 5 occurs twice) 

如何實現符合上述要求的通用函數。如何在一定範圍內自動生成重疊整數

EDIT1:

這是我現在..

protected List<Integer> fetchOverlapIntegers(int min, int max, 
     int howMany, int overlap) { 
    // The following code fetches unique numbers within the range 
    List<Integer> numbers = this.fetchRandomIntegers(min, max, howMany); 

    if (overlap > 0) { 
     int size = numbers.size(); 
     for (int i = 0; i < overlap; i++) { 
      numbers.set(size - 1 - i, numbers.get(i)); 
     } 
    } 
    Collections.shuffle(numbers); 

    return numbers; 
} 
+1

如果您真的提出了我們可以提供幫助的解決方案,那將會很不錯。因爲那裏你基本上要求我們爲你做你的工作,而你什麼都不做... – 2010-12-08 05:44:08

回答

1

只是爲了笑容我寫這彌補了這個非常得以確認的問題:

public static List<Integer> weirdFunction(List<Integer> criteria, List<Integer> candidateNumbers) { 
    List<Integer> results = new ArrayList<Integer>();  
    for (int occurrenceCount = 0; occurrenceCount < criteria.size(); occurrenceCount++) { 
     int thisMany = criteria.get(occurrenceCount); 
     for (int i=0; i < thisMany; i++) { 
      Integer theChoice = candidateNumbers.get(new Random().nextInt(candidateNumbers.size())); 
      for (int ct=0; ct < occurrenceCount; ct++) { 
       results.add(theChoice); 
      } 
     } 
    } 
    Collections.shuffle(results); 
    return results; 
} 

這需要兩個列表,其中一個是criteria,它基本上是它將在結果中放置隨機選擇的數字的次數的列表(第一個被選擇一次,第二個被選擇兩次等),以及列表candidateNumbers從中他們將被選中。

但是,這種方式只允許您爲每個標準指定一個特定的「計數」。例如您不能擁有「兩次出現兩次」的列表,因爲「出現兩次」只有一個插槽。當然,你可以將它作爲列表或其他數據結構的列表。

此外,它不會消除重複,因爲如果我們有criteria{1, 1, 1}它會嘗試拉一個數字一次,一個數字兩次,一個數字三次。但它不檢查是否有任何數字是相同的 - 所以最終可能每次都拉同一數字,並有效地拉六次一個數字,而不是一次,兩次和三次分別輸入三個單獨的數字。

0

可以隨機從競爭者值列表中拉出來的物品,例如:

List<int> numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
Random r = new Random(); 
for (int i = 0; i < 4; i++) 
{ 
    int index = r.Next() % numbers.Count; 
    Console.WriteLine(numbers[index]); 
    numbers.RemoveAt(index); 
} 

如果你想有一個值的三倍,只是三倍首先刪除。然後在最後洗牌。

相關問題