これは、セットを使用し、必要なサイズになるまでそれを塗りつぶす別の方法です。 numbersToDraw最小から(範囲を含む)の範囲内の異なる乱数を生成します。また、数値が描画された順序も保持されます(つまり、LinkedHashSetが対象です)。
private static Set<Integer> drawNumbers(int min, int max, int numbersToDraw) {
if (max < min) {
throw new IllegalArgumentException("Minimum must be less than maximum.");
}
if (max < 0 || min < 0) {
throw new IllegalArgumentException("Both range numbers must be positive.");
}
final int countOfNumbers = max - min + 1;
if (countOfNumbers < numbersToDraw) {
throw new IllegalArgumentException("Range is not big enough.");
}
final Random randomizer = new SecureRandom();
final Set<Integer> numbersDrawn = new LinkedHashSet<>();
while (numbersDrawn.size() < numbersToDraw) {
final int randomNumber = min + randomizer.nextInt(countOfNumbers);
numbersDrawn.add(randomNumber);
}
return numbersDrawn;
}
あなたが一意であることの番号を必要としない場合、あなたは、Java 8でこれを使用することができます。
final Random randomizer = new SecureRandom();
final List<Integer> numbersDrawn = IntStream
.range(0, numbersToDraw)
.mapToObj(i -> min + randomizer.nextInt(max - min + 1))
.collect(Collectors.toList());
あなたが一意であることの番号を必要としませんが、あなたは彼らの個別の値を印刷したい場合(あなたの元の質問ということです?):
final Random randomizer = new SecureRandom();
final Set<Integer> numbersDrawn = IntStream
.range(0, numbersToDraw)
.mapToObj(i -> min + randomizer.nextInt(max - min + 1))
.collect(Collectors.toSet());
そして、あなたの具体的なケースのための1つ以上の代替:
final Set<Integer> distinctNumbers = Arrays
.stream(lotteryNumbers)
.distinct() // you can leave this as the set is distinct automatically
.boxed()
.collect(Collectors.toSet());
ランダムは使用しないでください。 –
http:// stackoverflowの重複。com/questions/8115722/generation-unique-random-numbers-in-java – Satya
@nikpon 'ランダム 'の何が問題なのですか?それは完全に良いです – Dici