2013-07-14 36 views
2

我需要在Java中尽可能高效地生成0到1000之间的非重复随机数列表。我现在只有2个想法,想知道是否还有其他更好的想法,如果不是,我应该使用以下想法?高效地生成Java中的随机非重复数字列表

    • 生成0和1000之间的随机数r,并将其添加到称为randomArray [R]在标r
    • 生成另一个随机数,并检查另一个阵列如果randomArray [R]是不是已经存储先前生成的随机数
    • 继续下去,直到我做
    • 产生一个数组,并用它填充它的元素s指数
    • 将其像疯了似的洗牌(另外,我怎样才能有效地做到这一点?)
    • 从头开始使用数组中的元素值。

谢谢!

+2

啧啧,我不记得今天已经看到这个问题了,现在已经接近午夜了!新纪录! –

回答

2

java.util.Collections.shuffle方法将相同可能性的列表洗牌。创建一个List并将值从0增加到1000.然后使用此方法缓冲List。

List l = new ArrayList(); 
for(int i = 0; i <= 1000; i++) 
    l.add(i); 

Collections.shuffle(l); 

现在列表中包含混洗值。

+1

建议编辑:'new ArrayList(1001);' – johnchen902

+0

为什么1001而不是1000? –

+0

@QuinnLiu从0到1000有1001个数字:p – stinepike

1

尝试使用LinkedHashSet<Integer>(请参阅documentation)。

定期中存储一组Integer小号有效地:将一个新的号码,并检查一个数是否已经存在在一定时间(在阵列中存储的号码时,如你所提到的,这些查找采取线性的时间内完成去检查)。现在

,因为你说你要号码的列表,我们使用具有普通的所有属性LinkedHashSet<Integer>,也garantees,如果您遍历所有的元素,你总是会通过他们在同一个迭代订购。

的代码会是这个样子:

Set<Integer> randomNumberList = new LinkedHashSet<Integer>(); 

int r; 

// Make sure the number is not present in the list, and then add it: 
do { 
    r = ... // Generate your next random number 
} while(randomNumberList.contains(r)); 

// At this point, we know r is not in the list, so add it: 
randomNumberList.add(r); 

// Do the previous as many times as you want. 

// Now, to iterate over the list: 
for(Integer number : randomNumberList) { 
    // Do something... 
} 

注意,do - 如果你想确保你实际上是一个号码添加到列表中while循环是必要的。