collection.shuffle () を使用し、指定されたサイズのサブリストを選択するか、値をリストに入れ、インデックスの要素を削除します
found.add (list.remove (random.nextInt (list.size ()));
X回。各ステップでリストのサイズが縮小され、要素が 2 回表示されることはありません。
ただし、非常に大きな範囲の場合、有効な long の範囲としましょう。リストを作成してシャッフルしたり値を選択したりすることは適切ではありません。
したがって、セットを作成し、ランダムな値を選択して、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]");
}
}