0

だからここに人がするかもしれない最も簡単なことの1つがあります:

Random rng = new Random();
int a = rng.nextInt(10);
int b = rng.nextInt(10);

ここまでは順調ですね。ただし、aとbが等しくなることは避けたいので、当然、次のようにします。

Random rng = new Random();
int a = rng.nextInt(10);
int b = rng.nextInt(10);
while (a == b){
  b = rng.nextInt(10);
}

ただし、非常に大きな驚きですが、whileループ終了することはありません。一度もない。

理論的には、乱数を使用すると、1つの数の無限のシーケンスを持つことができることを理解しています。しかし、私はこのコードを10分間実行しましたが、ループを終了していません。

これはどうしたの?最新のLinuxMintでJDK6Update16を実行しています。

4

4 に答える 4

7
    Random rng = new Random();
    int a = rng.nextInt(10);
    int b = rng.nextInt(9);
    if (b >= a) ++b;

問題が解決しました!

于 2009-11-28T17:30:34.967 に答える
4

なぜこれが起こるのかわかりません-Windows用の1.6.0_16で試しましたが、問題はありませんでした。完全なクラスは次のとおりです。

import java.util.Random;
public class Test {
    public static void main(String[] args) {
        Random rng = new Random();
        int a = rng.nextInt(10);
        int b = rng.nextInt(10);
        while (a == b){
            System.out.println(b + " is equal to " + a + "!");
            b = rng.nextInt(10);
        }
        System.out.println(a);
        System.out.println(b);
    }
}

「aはbに等しい!」と表示されることがあります。1〜2回続けて出力しますが、その後は動作します。

于 2009-11-28T17:08:54.640 に答える
1

実際には、それは機能するはずです。環境に問題があります。

ただし、理論的には、ランダムとは何かを予測することはできません。ランダムジェネレーターが100万回連続して同じ数を与える場合は合法です。決定論的なコードを作成するには、次のようにします。

int a = rng.nextInt(10);
int b = rng.nextInt( 9);
b = (a+b+1)%10;
于 2009-11-28T18:36:55.753 に答える
0

シードを他の何かに設定して、それが役立つかどうかを確認してみてください。

rng.setSeed(123456);

于 2009-11-28T17:20:00.200 に答える