2017-04-06 74 views
3

我試圖編程一個隨機數發生器不會產生一次以上相同的隨機數。但我無法也不知道爲什麼。我的代碼是這樣的時刻:隨機數發生器無需更換?

public void printNS(){ 

    System.out.print("Numeros Numeros: "); 

    for(int i=0; i < 5 ; i++){ 
     System.out.print((int)(Math.random()*50) + ","); 
    } 

    System.out.print("; Numeros Stars: "); 

    for(int i=0; i < 2 ; i++){ 
     System.out.print((int)(Math.random()*12)+ ",");  
    } 

} 
+0

你可以使用set結構嗎? – Sedrick

+4

生成真隨機數比你想象的要難得多......大多數都是僞隨機數。 https://www.random.org/ – brad

+0

一個簡單的解決方案是存儲您生成的編號,以便您可以稍後檢查是否有重複。但它帶有內存成本 –

回答

6

在Java 8,你可以做以下

int[] rand = new Random().ints(start, end).distinct().limit(number).toArray(); 

/詳情選項看到doc

和Java 8,然後才能使用一套。產生的隨機數,直到您設定的尺寸小於隨機數

0

這裏的期望數量:

private printStars(int loops, int factor) { 
    for(int i=0; i < loops ; i++){ 
    System.out.print((int)(Math.random()*factor) + ","); 
    } 

現在:

public void printNS(){ 
    System.out.print("Numeros Numeros: "); 
    printStars(5, 50); 
    System.out.print("; Numeros Stars: "); 
    printStars(2, 12); 

希望有所幫助。關鍵是:當你有重複代碼時,看看那些「相同」的元素;然後將它們移動到另一種方法!

2

所以你想k不同的隨機數從0n(與k < n)。

兩種可能的方法:

  1. 選擇k隨機數,因爲你已經做了,並將它們存儲在一個數據結構。每次你選擇一個號碼,檢查它是否已經包含在結構中:如果是,繼續選擇,直到你有一個「新」隨機數。這是一個足夠簡單的方法,但循環可能會阻止您的應用程序。我建議使用Set是因爲它存儲的定義不同元素

    Set<Integer> set = new LinkedHashSet<>(); // unordered 
    while (set.size() < k){ 
        set.add((int)(Math.random()*n)); 
    } 
    System.out.println(set); 
    
  2. 創建List0n之間每隔數初始化。然後洗牌。第一個k列表中的元素是你想要的數字。

    List<Integer> list = new ArrayList<>(n); 
    for (int i = 0; i < n; i++){ 
        list.add(i); 
    } 
    Collections.shuffle(list); 
    list.subList(0, k).clear(); 
    System.out.println(list); 
    

我建議第二種方法,因爲它是更乾淨,我不知道,雖然你的效率要求。

+0

好吧,小夥子非常感謝,看一個更多的問題是否有任何easyer方式隨機生成像我一樣的數字,但更簡單? –

+0

你是什麼意思? 'Math.random()'對我來說看起來很簡單 – Oneiros