2012-05-28 180 views
3

我有采取隨機INT數隨機選擇INT數

for (int i=1;i<=5;i++) { 
    int rand= new Random().nextInt(10); 
    Log.d("Ramdom number", String.valueOf(rand)); 
} 

問題下面的代碼是,我不想重複的隨機數,當我運行這段代碼它給我的5個號碼的意思但其中兩個至少重複。有什麼建議?

+6

看看這個問題:http://stackoverflow.com/questions/4040001/creating-random-numbers-with-no-duplicates –

+0

在你的真實代碼中'nextInt()'的值有多大? –

+0

nextInt()將爲大約30. – Daler

回答

7

一個小範圍的數字可供選擇,這應該做的伎倆:

ArrayList<Integer> numbers = new ArrayList<Integer>(); 
for (int i = 0; i < 20; ++i) { 
    numbers.add(i); 
} 
Collections.shuffle(numbers); 
for (int i = 0; i < 5; ++i) { 
    Log.d("Random number", numbers.get(i).toString()); 
} 
+0

'Collections.shuffle()'包含在庫存Java安裝附帶的庫中嗎? –

+0

@TonyEnnis:它是Java SE的一部分:http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#shuffle%28java.util.List%29 – reima

+0

謝謝,這就是很高興知道。那麼我最喜歡你的解決方案。 –

1

問題是你正在循環中創建一個Random對象。如果循環是「緊」的,就像在這種情況下一樣,Random對象將被賦予相同的值。在循環外部移動Random對象初始化應該可以做到。

Random r = new Random(); 
for (int i=1;i<=5;i++) { 
      int rand= r.nextInt(10) 

      Log.d("Ramdom number", String.valueOf(rand)); 

    } 

編輯:

這應該工作(至少它爲我做的)

public static Integer[] getRangedInt(int maxRange, int numCount) 
{ 
    if (maxRange < numCount) 
    { 
     throw new Exception("maxRange cannot be smaller than numCount"); 
    } 

    Set<Integer set = new HashSet<Integer>(); 
    Random r = new Random(); 
    while (Set.size() < numCount) 
    { 
     int random = r.nextInt(maxRange); 
     while (!set.add(random)) 
     { 
      random = r.nextInt(maxRange); 
     } 
    } 

    return set.toArray(new Integer[set.size()]); 
} 
+0

這是一個錯誤修復(很好觀察),但它不會確保不重複。 –

+0

它沒有工作,所以 – Daler

+0

@Daler:請參閱編輯工作解決方案。 – npinti

0

所以你要找的究竟是不是隨機數的列表,這是一個列表隨機排列的30個數字。

一種方法是生成所有可能值的列表,然後對它們進行隨機排序,然後根據需要將它們從列表的前面剝離。下面是一些僞代碼:

for(int i=1; i<=30; i++) { 
    double r = rand(); 
    while (null != aTreeSet.get(r)) r = rand(); 
    aTreeSet.put(r, i); 
} 

其中rand()返回一些隨機值(不是你所尋求的1-30,這是i)也許是0和1之間aTreeSet是你在想什麼。

該循環可防止在rand()返回dup的情況不太可能發生時產生悲傷。

要使用此功能,請按排序順序從aTreeSet中提取值。

編輯 - 解決方案

另一種方式是產生1-30值,如果它是不是已經在「我所看到的這個」設置,添加它和返回值。如果它在那裏是,則生成一個新的隨機數。重複,直到發現一個未使用的號碼。相對而言,這在最後幾個值中表現不佳。對於現代處理器上的30個值,當然會以毫秒爲單位完成。如果你的最大值是1000而不是30,我會開始擔心。

+0

如果你想知道一個數字是否已經生成,你必須能夠檢查它,並且需要數據結構。我會發布另一個解決方案,但它很糟糕。 –

-1

您可以保存生成的數字在一組,並使用隨機數只有當它是不是在一套

Random r = new Random(); 
    Set<Integer> generatedNumbers = new HashSet<Integer>(); 
    for(int i = 1;i<=5;i++) { 
     int rand = r.nextInt(10) 
     if (!generatedNumbers.contains(rand)) { 
     Log.d("Ramdom number", String.valueOf(rand)); 
     generatedNumbers.add(rand); 
     } 
    } 
+0

工作,但不會擴展(雖然OP說最大值只有30)順便說一句,你的代碼有一個錯誤。在副本上,不會打印任何值。所以它不打印dups(thumbsup),但在這種情況下也不會打印5個值。 –

0

我認爲你需要一組隨機數。這個提示就足夠了。

如果不是,請評論。

0

可以保持生成的數字

boolean flag=false; 
Vector<int> vec = new Vector<int>(); 
for (int i=1;i<=5;i++) { 
     flag=false; 
     int rand= r.nextInt(10); 
     for(int j=0;j<vec.size();j++) 
     { 
      if(vec.get(j)==rand) 
      { 
       flag=true; 
       break; 
      } 
     } 
     if(flag) 
     { 
      continue; 
     } 
     else 
     { 
      Log.d("Ramdom number", String.valueOf(rand)); 
      vec.add(rand); 

     } 
} 

您可以維護產生的數字向量和檢查

的一個列表已經產生該號碼,然後產生新的

其他顯示此號碼

1
final int maxnumbers = 5; 
final int maxvalue = 10; 
final Random generator = new Random(); 
Set<Integer> numbers = new HashSet<Integer>(); 
while(numbers.size() < maxnumbers){ 
    numbers.add(random.nextInt(maxvalue)); 
} 

在此循環之後,您應該在集合numbers中的0到maxvalue之間有非重複的隨機數maxnumber。您必須小心謹慎,以免在使用此方法時得到太多迭代次數,即在10000以內生成9999個非重複數字可能需要很長時間。

另一個更具擴展性的版本將有號碼的清單:

List<Integer> numbers = new ArrayList<Integer>(); 
for(int i = 0; i<maxvalue; i++){ numbers.add(i); } 
Collections.shuffle(numbers); 
List<Integer> randomnums = numbers.subList(0, maxnumbers); 
+0

啊,我喜歡你的方法去除dups。 –

+0

爲什麼第二個代碼片段中的「subList(0,maxnumbers)」?無論如何,列表中只有'maxvalue'數字。 –

+1

@PhilippReichart'maxnumbers'和'maxvalue'是兩個不同的值,列表包含'maxvalue'不同的值,其中他只需要'maxnumbers'。 – Jave

0

你想要的是一個隨機的組合,使用Hash表,以避免重複

從我頭頂的代碼應該是這樣的:

Ramdom r = new Random(); 
    Hashtable<Integer, Integer> h = new Hashtable<Integer, Integer>(); 
    while(h.keys().size() < 5) { 
      int i = r.nextInt(10); 
      h.put(i,i); 
    } 
    Integer[] k = (Integer[]) h.keySet().toArray(); 

h.put(i,i); 

只是重寫值,如果它是重複的,所以只有不同的繪製數字將在哈希表中的條目。

+1

我不認爲這是準確的 - 散列表不隨機排序值 - 有一個明確的算法。當你把這些數值拉出來時,會有偏差。我用'h.put(aRandomValue(),i)替換'h.put(i,i)'' –

+0

@TonyEnnis哈希表的定義是密鑰是唯一的,它們沒有預定義的順序::::這個代碼只是選擇10箇中的5個不同的數字,如果你想用任何你喜歡的排序算法來排序。 – ilomambo

+0

據我所知,散列表是爲了有效地提取和提取值而不是隨機排序。你認爲依賴黑盒代碼的一個好方法是一個好主意嗎? –