1

重複の可能性:
Java で一意の乱数を生成する

コードは範囲から6つの乱数を生成しますが、それらが一意である必要があり、私の脳を溶かしていました。

import java.util.Random;
import java.util.Arrays;
public class numbers
{
private int[] lottoNumbers;
private int nextInt;
private Random r;

public numbers()
{
    lottoNumbers = new int [6];
    r = new Random();
    nextInt();
}
public void nextInt()
{
    System.out.print("***     ");
    for (int i = 0; i < lottoNumbers.length; i++)
    {
        lottoNumbers[i] = r.nextInt(49) +1;
        System.out.print(" " + lottoNumbers[i]);
    }
    System.out.println("     ***");
}
}
4

7 に答える 7

6

6 つの数値のそれぞれについて、既に生成された数値と比較する必要があります。それらのいずれかと同じ場合は、試し続ける必要があります。

于 2013-01-04T14:16:59.423 に答える
4

シャッフルメソッドを使用するだけで、シャッフル後に最初の 6 つの要素を返すことができます。

// Create the list of possible numbers
List<Integer> numbers = new ArrayList<Integer>(50);
for(int i = 1 ; i <= 50 ; ++i) {
    numbers.add(i); 
}
// Shuffle the list
Collections.shuffle(numbers);

// Print the numbers
int count = 0;
for(int number : numbers) {
    System.out.println("Random number " + count + ": " + number);
    ++count; // break if count == 6?
}

この方法の利点は、線形時間 (シャッフルにかかる時間) で実行されることです。x要素の時間 (x非常に大きくなる可能性があります) を選択して、既に選択されているかどうかを確認することを避けます!

于 2013-01-04T14:23:00.650 に答える
2

すでに追加したアイテムの中に番号が存在するかどうかを確認するループを追加する必要があります。boolean変数を定義してに設定falseし、既存の数値と新しく生成された数値を比較するループを実行します。重複している場合は、 を に設定booleantrueます。ループが終了しbooleanたら、新しい番号を追加する必要があるかどうかを確認します。

int i = 0;
do {
    int next = r.nextInt(49) + 1;
    boolean seen = false;
    for (int j = 0 ; j != i ; j++) {
        if (lottoNumbers[j] == next) {
            seen = true;
            break;
        }
    }
    if (!seen) {
        lottoNumbers[i++] = next;
        System.out.print(" " + next);
    }
} while (i != lottoNumbers.length);

より良い解決策は を使用するSet<Integer>ことですが、これはおそらくこの段階では高度なトピックです。

于 2013-01-04T14:18:02.617 に答える
1

a を使用するだけSetです (改善されたバージョンの @dty に感謝します!):

private static final Random RND = new Random();
private static final int COUNT = 6;

public int[] getRandomNumbers()
{
    final Set<Integer> set = new HashSet<Integer>(COUNT);

    /*
     * This works: .add() will not add the same element twice. As such, we just
     * need to check that the set has the expected size.
     */
    while (set.size() < COUNT)
        set.add(RND.nextInt());

    return set.toArray(new int[COUNT]);
}
于 2013-01-04T14:21:09.023 に答える
0

この先どう?

package rabdomnumbers;

    import java.util.ArrayList;
    import java.util.List;

    public class RabdomNumbers {
    public static int SIZE = 6;

      public static void main(String[] args) {
        Number[] numbers = new Number[SIZE];
        // set an array
    for (int x = 0; x < SIZE; x++) {
      numbers[x] = new Number();
    }
    // sort an array
    for (int x = 0; x < SIZE-1; x++) {
      for (int y = x + 1; y < SIZE; y++) {
        if (numbers[x].getNumber() > numbers[y].getNumber()) {
          Number buf = numbers[x];
          numbers[x] = numbers[y];
          numbers[y] = buf;
        }
      }
    }
    // print an array
    for (int x = 0; x < SIZE; x++) {
      System.out.println("" + numbers[x].getIndex());
    }
  }
}

Number は単純なクラスです。

package rabdomnumbers;

import java.util.Random;

public class Number {
  private int index = 0;
  private int number = 0;
  private static int count = 0;
  private final static Random RND = new Random();

  public int getIndex() {
    return index;
  } 

  public int getNumber() {
    return number;
  }

  public Number() {
    index = count++;
    number = RND.nextInt();
  }
}
于 2013-01-04T15:38:23.550 に答える
0
public void nextInt()
{
    System.out.print("***     ");
    for (int i = 0; i < lottoNumbers.length; i++)
    {
        int temp;

        // check random int doesn't already exist (embedded assignment below)           
        // NOTE: while loop has empty body, note {} in line below
        while (Arrays.asList(lottoNumbers).contains(temp = r.nextInt(49)+1)){}

        lottoNumbers[i] = temp;
        System.out.print(" " + lottoNumbers[i]);
    }
    System.out.println("     ***");
}
于 2013-01-04T14:23:31.133 に答える
0

私はセットのアプローチが好きですが、例は少し簡素化することができます

private static final Random RND = new Random();

public static Set<Integer> getRandomNumbers(int count) {
    final Set<Integer> set = new HashSet<>(count);
    while (set.size() < count) {
      set.add(RND.nextInt());
    }
    return set;
}
于 2013-01-04T14:40:22.420 に答える