我想在0-500范围内创建10个随机数。但问题是我希望这些数字是唯一的。对于2个随机数,我可以创建如下内容:
int randomItem1 = r.nextInt(500);
int randomItem2 = r.nextInt(500);
while(randomItem1==randomItem2){
randomItem1=randomItem();
randomItem2=randomItem();
}
但如果我这样做10,我认为它会堆叠。而且我这样说是因为我正在尝试创建一个巨大的算法,它试图进行连续的评估,我想要不断地获取10个随机和唯一的数字。我不知道该怎么办。有什么想法或建议吗?
答案 0 :(得分: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));
}
答案 1 :(得分: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]
答案 2 :(得分:3)
每次使用The Fisher-Yates shuffle使用数字时,从1-500中创建LinkedList
个数字,然后将其中的一个数字随机播放。
这将为您提供保证的每个数字的理智(恒定时间)性能。
答案 3 :(得分:-1)
我会使用一个数组,并将数字存储在该数组中。你会生成一个新的随机数,然后需要迭代你的数组到你的数字计数,检查它是否与你之前创建的匹配。