使用collection.shuffle(),并选择指定大小的子列表,或者把你的价值观在一个列表,并在指数
found.add (list.remove (random.nextInt (list.size()));
为X次删除元素。在每一步中,列表的大小都会减小,并且没有元素会出现两次。
但是,对于非常大的范围 - 可以说有效长期的范围,建立一个列表来洗牌或从中挑选值是不合适的。
因此,创建一个Set,并选择随机值,将它们添加到列表中,直到set.size()等于您需要的大小。
Runnable的例子:
import java.util.*;
public class Empty {
static Random random = new Random();
public static void main (String args [])
{
show (pick (10, 100));
show (securePick (10, 100000));
}
static public List <Integer> pick (int n, int max) {
List <Integer> result = new ArrayList <Integer>();
List <Integer> range = new ArrayList <Integer> (max);
for (int i= 0; i < max; ++i)
range.add (i);
for (int i= 0; i < n; ++i)
result.add (range.remove (random.nextInt (range.size())));
return result;
}
static public Set <Integer> securePick (int n, int max) {
Set <Integer> result = new HashSet <Integer>();
while (result.size() < n)
result.add (random.nextInt (max));
return result; // <Integer>
}
public static void show (List <Integer> liste)
{
System.out.print ("[");
for (int i : liste)
System.out.print (i + ", ");
System.out.println ("\b\b]");
}
public static void show (Set <Integer> liste)
{
System.out.print ("[");
for (int i : liste)
System.out.print (i + ", ");
System.out.println ("\b\b]");
}
}
使用HashSet的,如果该号码不在集合,使用它,否则再生? – DarthVader
一个不相关的技巧:你可以使用ArrayList而不是你现在正在用int数组做什么。 –
AHungerArtist
@DarthVader没有哈希集(与任何一般哈希相同)自动销毁重复出现? – 2012-05-12 21:45:24