5

4を含めて1から4までの範囲で乱数を発生させたいです。
これが私のコードです:

int num = r.nextInt(4) + 1;  //r is instance of Random.

ただし、上記のコードをループで実行しているため、乱数を繰り返したくありません。今起こっていることは、しばしば私が得ていることです:
1,1,1,2,3,1,4,2,2,1,4,2,4,4,2,1,4,3,3,1,4,2,4,1私の出力として。

ここでは、数字は範囲 (1 ~ 4) 内でランダムですが、最初の 3 回の繰り返しで数字 "1" のように繰り返されることがよくあります。

私が探しているのは、ループ内で繰り返されない乱数を取得する方法です。私が知っている簡単な方法の 1 つは、現在の反復と比較の前に最後の乱数を保持することですが、これにはもっと良い解決策があるはずです。
前もって感謝します。

4

4 に答える 4

7

その数値を使用random.nextInt(range-1)してから、前の数値を除外する関数を使用して出力数値にマップします。

public class Test {
  private final Random random = new Random();
  private final int range;
  private int previous;

  Test(int range) { this.range = range; }

  int nextRnd() {
    if (previous == 0) return previous = random.nextInt(range) + 1;
    final int rnd = random.nextInt(range-1) + 1;
    return previous = (rnd < previous? rnd : rnd + 1);
  }


  public static void main(String[] args) {
    final Test t = new Test(4);
    for (int i = 0; i < 100; i++) System.out.println(t.nextRnd());
  }
}
于 2012-12-13T14:58:58.223 に答える
1

選択できる数よりも多くの数字があるため、いくつかの数字を繰り返さなければなりません。できることは、即時の繰り返しの数を最小限に抑えることだけです。

これを行う 1 つの方法は、Collections.shuffle を使用することです。これを使用すると、番号をランダムな順序で、繰り返すことなく、毎回これを行うことができます。最後の N 値が繰り返されるのを防ぐことができます。

連続した繰り返し数を停止するには、範囲を減らしてモジュラスを使用できます。

int n = 0, max = 4;
Random rand = new Random();

for(int i = 0; i < numbers; i++) {
   n = (n + rand.nextInt(max-1)) % max;
   int numToUse = n + 1;
   // use this number.
}

max-1最後に使用された値を除外しているため、実際には可能な値しかないため、これは機能します。

于 2012-12-13T15:00:45.750 に答える
1

「より良い」答えはありません。乱数を取得しています。この行を確認してください:

1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

これ完全にランダムである可能性があります。したがって、より良い要件を説明することをお勧めします。常に前とは異なる次の番号が必要ですか? 特別な呼び出し音で最大の複製が必要ですか? 6 つの連続する数字の中で、すべての数字が 2 回発生することが許可されているとしましょう。

そのような要件をお持ちいただければ、お手伝いできるかもしれません。それ以外の場合は、次のように言うことができます: あなたが見ているものは本当にランダムです :)

于 2012-12-13T15:01:03.760 に答える