在Java中有效地生成随机非重复数字的列表

时间:2013-07-14 03:42:49

标签: java random

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

    • 生成0到1000之间的随机数r并将其添加到另一个名为randomArray [r]的索引r
    • 生成另一个随机数并检查randomArray [r]是否尚未存储先前生成的随机数
    • 继续,直到我完成
    • 生成一个数组并用其索引
    • 填充其元素
    • 像疯了一样洗牌(另外,我怎样才能有效地做到这一点?)
    • 从头开始使用数组中的元素值。
  1. 谢谢!

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循环。