2013-07-15 122 views
3

在java中使用隨機工具時,會得到如下所示的一些數字:1271,34556,177等等......使數字不重複的最簡單方法是什麼?如何在Java中使用非重複數字生成隨機數字?

+0

你能不能讓我們知道目的是什麼? – Reddy

+3

@cathulhu:它看起來不同,因爲不是數字本身不應該重複,而是生成的數字中的數字。 – flolo

+0

@cathulhu,謝謝你。這是今天學到的一個很好的算法:) – Reddy

回答

3

如何創建一個循環來檢查生成的隨機數是否符合您的要求。

final Random rnd = new Random(); 
int n; 
do { 
    n = rnd.nextInt(1000); 
} while(containsRepeatingDigits(n)); 

containsRepeatingDigits可以是這樣的:

boolean containsRepeatingDigits(final int n) { 
    final boolean digits[] = new boolean[10]; 
    for(char c : String.valueOf(n).toCharArray()) { 
     final int i = c-'0'; 
     if(digits[i]) 
      return true; 
     digits[i] = true; 
    } 
    return false; 
} 
9

您可以將數組[1,2,3,4,5,6,7,8,9]洗牌並讀取爲數字。

如果您不想修復數字位數或允許非前導零,它會變得更加複雜(如果您關心某種平均分配)。

+0

謝謝,這非常有幫助!你看,我剛剛對java很陌生,並且正在寫我的第一個「正確」程序。 – user2582956

6

您可以使用數字0-9初始化List。然後隨機化這個列表,並從這個列表中輪詢隨機數量的元素(1到9之間)。將這些數字連接起來,並將您的號碼設爲非重複數字。

+3

隨機數量的元素是棘手的。如果你使用天真的分配方式,你會得到比你想要的短得多的數字(少於10%的所有數字,最多10位數字只有一位數字,但最終可能會達到10%)。 – Thilo

1

您可以檢查隨機數是否有重複數字,如果有,則生成一個新數字。它是用C#編寫的,但你應該可以很容易地將它轉換成Java。

private static Random rand = new Random(); 
    public static int GenerateNumberNonRepeat() 
    { 
     int number; 
     do 
     { 
      number = rand.Next(); 
     } while (IsRepeating(number)); 

     return number; 
    } 

    public static bool IsRepeating(int number) 
    { 
     string textual = number.ToString(); 
     for (int i = 0; i < textual.Length; i++) 
     { 
      for (int j = i + 1; j < textual.Length; j++) 
      { 
       if (textual[i] == textual[j]) 
        return true; 
      } 
     } 

     return false; 
    } 
+0

這是獲得均勻分佈的最簡單方法。但是,對於大數字可能會有點緩慢。假設你想要一個小於10^10的隨機數,那麼約90%的數字是無效的。 –

0

的另一種方式,以產生這些數字是生成任意數,並且在情況下,它包含重複的數字或者產生一個新的,或刪除重複的數字(例如通過遞增數,直到沒有更多的重複號)。

與提議的洗牌/選擇方法相反,這具有優勢,即可以(或多或少)保留原始rng的分佈。

0

此代碼可以幫助你

Set set = new HashSet<Integer>(); 
    Random rand= new Random(); 
    public int getNonRepeatingRandomNumber() { 
     int intV = rand.nextInt(); 
     if(set.contains(intV)) { 
      return getNonRepeatingRandomNumber(); 
     } 
     else { 
      set.add(intV); 
      return intV; 
     } 
    } 
相關問題