2013-03-09 182 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);