2013-04-28 242 views
1

所以,我有一個隨機數生成器,它在1和用戶輸入的最大值之間生成10個數字。它運作良好,但我想讓它不會產生重複的數字。因此,如果它生成一個5,其他數字都不能是5.生成唯一隨機數列表

+0

什麼語言是你使用? – 2013-04-28 06:21:08

+0

對不起,錯過了。通常,人們會標記語言而不是將其包含在標題中。 (將爲他編輯) – 2013-04-28 06:21:45

+0

一種解決方案可能是使用Set而不是List。如果它生成一個副本。設置將忽略它,你可以再次生成一個新的號碼。繼續操作,直到設置尺寸未達到極限,即您的情況下有10個數字。 – 2013-04-28 06:23:20

回答

3

您可以嘗試拒絕採樣。從空集開始。生成一個數字,如果它在集合中,請再試一次。這就是說繼續選擇,直到你找到一個不在集合中的數字。找到新號碼後,將其添加到設置中,然後將其返回給用戶。

當然,如果產生了大量的數字,比如說k和上限是n,那麼得到一個新數字的時間遵循幾何分佈(成功概率(nk)/ n),所以在找到唯一編號之前所需的採樣數量是n /(nk)。

3

如果您有一個最小值,您可以使用Collection.shuffle()一個唯一值列表。從這裏你可以選擇10個元素。

+0

最大值將隨我所製作的節目而變化。我可以在5到50之間的任何地方。而且,它實際上是隨機選擇字母,我只是讓它在隨機數的位置得到一個字符串的字符。 – user2328462 2013-04-28 08:17:51

+0

範圍必須與您要選擇的數量相同或更大。您不能獲得10個唯一值,其最大範圍小於10。 5. – 2013-04-28 16:55:02

0

爲了確保號碼不重複,請將找到的號碼存儲在Java SET中,以便只在內部沒有重複時才添加。

Algorith隨機生成可以是這樣的:

take the system time as your seed value 
use this to get the random numbers 
suppose user says number between 1-100 
so take system milliseconds%100 so time always changes so maximum probability that you get random numbers. 

所以,始終以種子值MOD(%)的上限,在這種情況下它的100

0
int i = 0, r = 0; 
    boolean ch = true; 
    int[] list = new int[num]; 
    while (i < num) 
    { 
     r = rnd.nextInt(num); 
     ch = true; 
     for (int j = 0; j < i; j++) 
      if (r == list[j]) 
      { 
       ch = false; 
       break; 
      } 
     if (ch) 
     { 
      list[i] = r; 
      i++; 
     } 
    } 
+1

在解釋什麼是代碼和控制點時增加幾點。 – Phani 2015-09-14 13:11:14