2012-02-24 180 views
6

我想创建0-500范围内的10个随机数。但问题是我希望这些数字是唯一的。对于2张随机数,我可以创造的东西,如下所示:在Java中生成一组唯一的随机数

int randomItem1 = r.nextInt(500); 
int randomItem2 = r.nextInt(500); 
while(randomItem1==randomItem2){ 
    randomItem1=randomItem(); 
    randomItem2=randomItem(); 
} 

但如果我这样做了10,我认为,虽然它会叠加。我这样说是因为我试图创建一个巨大的算法,它试图进行连续的评估,并且我想不断采取10个随机和唯一的数字。我不知道该怎么办。任何想法或建议?

+1

试用谷歌搜索它首先http://www.wikihow.com/Generate-N-Different-Random-Numbers – 2012-02-24 00:18:42

+1

但是,这是一个可怕的网站和答案有错。 – BCoates 2012-02-24 00:31:40

+0

@MichaelT怀疑它。另一个想要*范围内的一个*号码,而这一个想要*范围内的多个*号码。 – 2014-01-13 07:47:47

回答

3

让数字的LinkedList 1-500每一次洗牌一出它们的使用使用The Fisher-Yates shuffle一个数字。

这会给你保证每个拉数的理智(恒定时间)性能。

17

看起来像是将这些存储在单个变量中。存储这样的项目组的“正常”地点通常是列表或数组。

在这种情况下,请将它们存储在“set”数据结构中。它不会允许重复。

一套文档: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Set.html

Set set = new HashSet(); 

while (set.size() < 10) { 
    set.add(r.nextInt(500)); 
} 
+2

这是一个整洁的解决方案,再加上一个 – davogotland 2012-02-24 00:34:13

-1

我会使用一个数组,并将它们生成的数字存储到该数组中。你会产生一个新的随机数,然后需要遍历你的数组直到你的数量,检查它是否与你以前创建的匹配。

+0

这将是一个可怕的设计。不确定的CPU需求。以前的回复更重要的是:创建一个符合条件的数字源集合,“随机播放”,然后迭代随机结果列表。 – RichieHH 2014-05-19 11:21:29

+0

对于这个解决方案,我觉得主要的问题是编写更多的代码,而不是使用现成的数据结构。因为你不会使用像集合这样容易获得的数据结构,所以你会花更多时间编写和调试代码。根据您的应用程序,考虑到OP只需要10个随机数,我不确定我会担心CPU的需求。然而,许多现成的“集合”数据结构也将被设计为使用上面建议的O(n^2)算法更高效的一些东西。 – 2015-02-12 00:38:34

4

Java集合有一个shuffle方法。你可以把你的数字放入一个ArrayList中,然后洗牌。如果ArrayList包含n个数字,调用shuffle方法,将会为您提供包含n个数字但是随机排列的相同ArrayList。

for(int i=0;i<10;i++){ 
list.add(i); // list contains: [0,1,2,3,4,5,6,7,8,9] 
} 
Collections.shuffle(list);// list now contains: [0, 9, 3, 1, 5, 8, 7, 2, 6, 4]