使用collection.shuffle(),并选择一个指定大小的子列表,或者将你的值放在一个List中,并删除索引处的元素
found.add (list.remove (random.nextInt (list.size ()));
X 次。在每一步中,列表的大小都会减小,并且没有元素会出现两次。
但是,对于非常大的范围 - 假设有效多头的范围,构建一个列表来洗牌或从中挑选值是不合适的。
因此,创建一个 Set,并选择随机值,将它们添加到列表中,直到 set.size() 等于您需要的大小。
可运行示例:
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]");
}
}