2017-05-14 7 views
0

私はコレクションシャッフルを使用しますが、これまでは動作しません。乱数をユニークにして番号をソートする方法

import java.util.Random; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 

public class TotoMachine { 
    public static void main(String[] args) { 
     int[] array = new int[7]; 
     Random rand = new Random(); 
     for (int i = 0; i < array.length; i++) 
      array[i] = rand.nextInt(65) + 1; 
     //Collections.shuffle() 
     Arrays.sort(array); 
     System.out.println(Arrays.toString(array)); 
    } 
} 
+1

あなたがしようとしていることは、乱数自体を挿入するだけで十分です。それらを再度シャッフルする必要はありません。 – Fairoz

+0

しかし、私の出力番号は、シャッフルだけが独特の権利にすることができます繰り返しているかもしれません? –

+0

既存の番号の配列をチェックし、その新しい番号がある場合にのみ挿入する必要があるとします。 –

答えて

0

これを回避するとします。 あなたはListをよく知っていると思います。

public static void main(String[] args){ 
      List<Integer> array = new ArrayList<Integer>(); 
      Random rand = new Random(); 
      int num; 
      for (int i = 0; array.size() < 7 ; i++){ 

       num = rand.nextInt(65) + 1; 
       if(!array.contains(num)){ 
        array.add(num); 
       } 
      } 

      Collections.sort(array); 
      System.out.println(array.toString()); 
      }  
} 
+0

数値が2回生成された場合、これは7未満の数値を返す可能性があります。 – SilverNak

+0

@SilverNak指摘していただきありがとうございます。編集しました。 –

0

これは機能する可能性があります:セットに生成された乱数をいくつかのサイズまで追加します。次に、このように配列に変換します。

import java.util.*; 

class random{ 
    public static void main(String[] args){ 
    int max=65; 
    int min=0; 
    int size=7; 

    Set<Integer> set = new HashSet<Integer>(); 
    Random random = new Random(); 
    while(set.size()<size){ 
     int randomNum = random.nextInt((max - min) + 1) + min; 
     set.add(randomNum); 
    } 
    Integer[] intArray= set.toArray(new Integer[set.size()]); 
    Arrays.sort(intArray); 
    for(int i=0;i<size;i++){ 
     System.out.println(intArray[i]+" ");  
    } 
    } 
} 
0

Setを使用して一意の数字を得ることができます。たとえば、あなたはこの試みることができる:あなたはすでにsetを作成を使用するためにあらゆる機会を持っている場合は

import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Random; 
import java.util.Set; 

public class TotoMachine { 
    public static void main(String[] args) { 
     int[] array = new int[7]; 
     Random rand = new Random(); 
     Set<Integer> set = new HashSet<>(); 
     while (set.size() < array.length) { 
      set.add(rand.nextInt(65) + 1); 
     } 
     int i = 0; 
     for (Integer integer : set) { 
      array[i] = integer; 
      i++; 
     } 
     Arrays.sort(array); 
     System.out.println(Arrays.toString(array)); 
    } 
} 

を、int[]配列に変換するのではなく、それを行います。あなたの代わりにint[]Integer[]を自由に使用している場合、あなたはこのようにそれを変換することができます:

Integer[] arr = new Integer[7]; 
set.toArray(arr); 
0

私は、具体的Set(s)は、あなたがCollectionsを使用することをお勧め。 LinkedHashSet<Integer>を作成し、必要な数のランダム値を追加することができます。次に、これらの値をTreeSet<Integer>ソート)に追加することができます。何かのように、

Random rand = new Random(); 
final int SIZE = 7; 
Set<Integer> set = new LinkedHashSet<>(SIZE); 
while (set.size() < SIZE) { 
    set.add(rand.nextInt(65) + 1); 
} 
System.out.println(set); 
Set<Integer> sortedSet = new TreeSet<>(set); 
System.out.println(sortedSet); 

またはあなたはストリームを使用することができますし、あなたがこのようにユニークな乱数を作るためにSetデータ構造を使用することができます

List<Integer> list = set.stream().sorted().collect(Collectors.toList()); 
System.out.println(list); 
0

ようCollector

追加新しいランダムな要素がすべてSetにある場合は、それが固有の要素であれば 配列に追加するだけです。私は、これはあなたの問題を解決するだろう期待し

public static void main(String[] args) { 
    int[] array = new int[7]; 
    int randomNum; 
    Set<Integer> numbers = new HashSet<>(); //Set of unique elements 
    Random rand = new Random(); 
    for (int i = 0; i < array.length; i++){ 
     randomNum = rand.nextInt(65) + 1; 
     numbers.add(randomNum); 
     if(!numbers.contains(randomNum)){ // if unique element add it to array 
      array[i] = randomNum; 
     } 
     else{ // keep generating new random numbers until you get unique element 
      while(numbers.contains(randomNum)){ 
       randomNum = rand.nextInt(65) + 1; 
      } 
      numbers.add(randomNum); 
      array[i] = randomNum; 
     } 
    } 
    Arrays.sort(array); 
    System.out.println(Arrays.toString(array));    
} 

+0

@ Thomas.Chanこれを試してみてください私はそれが働いたと思います! – Oghli

1

これを試してください。

public static void main(String[] args) { 
    Set<Integer> set = new TreeSet<>(); 
    Random rand = new Random(); 
    while (set.size() < 7) 
     set.add(rand.nextInt(65) + 1); 
    System.out.println(set); 
} 
0

セットを使用しない場合は、次のようなことが考えられます。

乱数を生成します。

チェック配列は、乱数が

存在しない場合が存在するかどうかを確認します - 配列に乱数を挿入します。

存在する場合は、新しい乱数を生成し、上記の手順を繰り返します。

アレイの容量が最大になるまで、これを実行します。

この方法は、再帰を伴ってより甘くすることができます。

それ以外の場合は、セットを使用します。セットには重複が含まれません。

次に、例を示すように、セットを配列に変換できます。

関連する問題