2016-11-29 12 views
-1

ランダムに生成された6個の数値をHashSetに追加する方法を試しています。私は結果を得ていますが、それらは矛盾しています。時には6つの数字をコンソールに表示し、それ以外のときは5つの数字をコンソールに表示します。乱数発生器の結果が一貫しない

これは今朝初めてのことですので、大変明白であり、ありがとうございました場合はお詫び申し上げます。

HashSet<Integer> generatedLotteryNumbers = new HashSet<Integer>(); 
Random r = new Random(); 

for(int i=0; i<6; i++){ 
    generatedLotteryNumbers.add(r.nextInt(49)); 
} 

System.out.println(generatedLotteryNumbers); 
+0

Java Setsの機能についていくつかの調査を行い、ここで何が起こっているのか分かります。 – Tom

+1

タイトルが大好きです。 – shmosel

+0

ええ、私はそれをどのように言いたいのかよく分かりませんでした。shmosel – Schming

答えて

3

Setには重複する値を含めることはできません。したがって、ジェネレータが同じ番号を2回生成すると、その値は削除されます。代わりに、あなたはSet(またはListを使用)のサイズに基づいてループする必要がありますあなたは、Java 8を使用している場合

while (generatedLotteryNumbers.size() < 6) { 
    generatedLotteryNumbers.add(r.nextInt(49)); 
} 

、別のオプションは、直接に使用することができますStreamを生成するためにRandom#intsを使用することですSetを作成します。

Set<Integer> generatedLotteryNumbers = r.ints(0, 49) 
             .distinct() 
             .limit(6) 
             .boxed() 
             .collect(Collectors.toSet()); 
+0

興味深い。私はあなたが無限の流れの上で 'distinct() 'を呼び出すことができなかったことを理解していませんでした。 – shmosel

+0

この答えのわずかな問題は、理論的に*無限に実行できることと、ターゲットサイズ(6)が最大値(49)に近づくにつれてパフォーマンスが低下する可能性があることです。私はより正しいアプローチは、すべての潜在的な値の配列をシャッフルし、最初のn要素を選択することだと思います。 – shmosel

+0

@schmoselもし私たちが理論的になっていれば、ループが無限に動く確率は各反復で0に収束します。理論的には、ループが無限になる確率は0%です。パフォーマンス上の問題の意味を説明できますか? – 4castle

3

GeneratedLotteryNumbersは、(セットのように働く)HashSetで、JavaでHashSetがそれに既に存在しているので、重複を許可していない項目を挿入しませんので、あなたがしている場合これはありますいくつかの要素は共通しているため、1回だけ格納されるため、6つ未満の要素を取得します。重複した場合Set::add方法、TRUEによって返さbooleanが正常に追加されたキャプチャとFALSE、重複の挿入を検出するために

ArrayList<Integer> GeneratedLotteryNumbers = new ArrayList<Integer>(); 
Random r = new Random(); 
for(int i=0; i<6; i++){ 
    GeneratedLotteryNumbers.add(r.nextInt(49)); 
} 

ベターこれを試してみてください。

+0

ああ。私は一度だけ価値を蓄えていることを知っていましたが、重複を省いたことは分かりませんでした。 ありがとうございます。 – Schming

+1

ハッシュセットは重複の挿入を許可しません。詳しくは、次を参照してください。http://stackoverflow.com/questions/12940663/does-adding-a-duplicate-value-to-a-hashset-hashmap-replace-あなたの問題を解決した場合は、回答を受け入れ済みとマークしてください。 :) @Schming – Jarvis

+1

@Schming重複を省略しますが、そのときに 'add'メソッドは' false'を返します。だから完全に静かではありません。 – 4castle

関連する問題