我需要在Java中尽可能高效地生成0到1000之间的非重复随机数列表。我现在只有2个想法,想知道是否还有其他更好的想法,如果没有,我应该使用以下想法?
谢谢!
答案 0 :(得分: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 :(得分:1)
尝试使用LinkedHashSet<Integer>
(请参阅documentation)。
常规HashSet<Integer>
有效地存储一组Integer
:放置一个新数字并检查数字是否已经存在是在恒定时间内完成的(将数字存储在数组中时,就像你一样提到,这些查找需要线性时间来检查)。
现在,既然你说你想要一个数字列表,我们使用LinkedHashSet<Integer>
,它具有常规HashSet<Integer>
的所有属性,并且还保证如果你遍历元素,你将会总是以相同的顺序迭代它们。
代码看起来像这样:
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
循环。