2015-05-27 17 views
0

我試圖用Java創建Random類是不重複的輸出,並在這裏的一個子類隨機數發生器就是我這麼遠..非重複在Java中

import java.util.Set; 
import java.util.concurrent.CopyOnWriteArraySet; 

public class NonRepetitiveRandom extends java.util.Random { 
    private Set<Integer> noUseInts = new CopyOnWriteArraySet<Integer>(); 
    private static final long serialVersionUID = 1L; 

    @Override 
    protected int next(int bits) { 
     int i; 
     for (i = super.next(bits); noUseInts.contains(i); i = super.next(bits)) 
      ; 
     noUseInts.add(i); 
     return i; 
    } 
} 

它很好嗎?我需要添加任何東西嗎?我最初嘗試使用與上面相同的模型重寫每個next *方法,但是在注意到下一個方法本身用於所有next *方法後,我試圖單獨覆蓋它。

注意:洗牌方法將不起作用,因爲它會創建一個整個列表並在每次需要值時洗牌。而且,如果範圍很寬並且根本沒有指定範圍,那麼這將是不實際的。實際上,這種方法的唯一用例是當我已經有一個列表。作爲一個結論,一個非重複的隨機數發生器將是最實際的解決方案。

+0

它以什麼方式很好?這是一個瘋狂的要求。 –

+0

@MK,很好,它會生成非重複的數字。 –

+2

它逐漸變得隨機。 –

回答

0

它看起來像你的代碼會產生你想要的輸出。 但是,如果您打算將其用於很多代的隨機數,則您必須搜索以查找下一個隨機數的參數空間將繼續減少。天真地說,每次平均產生下一個隨機數需要更長的時間,所以如果你產生很多數字,請小心這個。