2013-03-09 85 views
2

我需要指定範圍內的唯一隨機整數。我使用這種方法:在Java中生成唯一隨機數的更好方法

class Main 
{ 
static final int RANGE = 100; 

static int uniqueGenerator(int range_, boolean boolArr_[], Random rand_) 
{ 
    int tmpVar = rand_.nextInt(range_); 
    while (boolArr_[tmpVar] == true) 
    { 
     tmpVar = rand.nextInt(range_); 
    } 
    boolArr_[tmpVar] = true; 
    return tmpVar; 
} 

public static void main(String[] args) 
{ 
    Random rand = new Random(); 
    boolean boolArr[] = new boolean[RANGE]; 
    Arrays.fill(boolArr, false); 
    int ceiling = 10; 
    int tmp = Main.uniqueGenerator(ceiling, boolArr, rand); 
    System.out.println(tmp); => 5 
    ceiling = 20; 
tmp = Main.uniqueGenerator(ceiling, boolArr); 
    System.out.println(tmp); => 17 

} 
} 

它似乎很麻煩。也許有人知道更好的方法? 編輯:我在遊戲代碼中使用它,所以我需要最有效的解決方案。下面的答案建議初始化新的列表,洗牌=>太耗費資源/每次需要更改範圍時都需要生成新列表。

+0

隨機數。如果你填寫你的布爾數組假的,它永遠不會進入while循環,不是嗎? – 2013-03-09 10:40:10

+0

你需要什麼?範圍在0-100之間的唯一整數? – 2013-03-09 10:40:57

+0

您是否需要範圍內的獨特或範圍內的獨特隨機? – GeorgeVremescu 2013-03-09 10:41:45

回答

4

用你想要的數字範圍填充一個數組,然後洗牌並提取一個項目。

編輯:看看Eng.Fouad's example看看這是如何實現的。

+0

不會得到唯一的數字+在運行時似乎會浪費太多資源。需要更簡單/更快的方法。 – Alf 2013-03-09 10:46:13

+1

您只有每個號碼一次,因此您只能得到一次相同的號碼(只要您保留指向下一個項目的指針) – 2013-03-09 10:46:50

+0

+1以獲得正確答案;) – 2013-03-09 11:24:56

3

生成並存儲在一組

Set<Integer> set = new HashSet<Integer>(100); 
    Random rand = new Random(); 
    while (set.size() < 1000) { 
     set.add(rand.nextInt(100)); 
    } 

    for (Integer integer : set) { 
     System.out.println(integer); 
    } 
7
List<Integer> list = new ArrayList<Integer>(); 
for(int i = 1; i <= 100; i++) list.add(i); 
Collections.shuffle(list);