在Java中生成一组唯一的随机数

Ale*_*lon 6 java

我想在0-500范围内创建10个随机数.但问题是我希望这些数字是唯一的.对于2个随机数,我可以创建如下内容:

int randomItem1 = r.nextInt(500);
int randomItem2 = r.nextInt(500);
while(randomItem1==randomItem2){
    randomItem1=randomItem();
    randomItem2=randomItem();
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做10,我认为它会堆叠.而且我这样说是因为我正在尝试创建一个巨大的算法,它试图进行连续的评估,我想要不断地获取10个随机和唯一的数字.我不知道该怎么办.任何想法或建议?

Chr*_*row 18

看起来您将这些存储在单个变量中.存储此类项目组的"正常"位置通常位于列表或数组中.

在这种情况下,请将它们存储在"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));
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个简洁的解决方案,加上一个 (2认同)

Muh*_*man 5

Java Collections有一个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]
Run Code Online (Sandbox Code Playgroud)


BCo*_*tes 3

从 1 到 500 中选择一个LinkedList数字,并在每次使用数字时使用Fisher-Yates 洗牌法从其中洗一个数字。

这将为您保证提取的每个数字都具有健全的(恒定时间)性能。