0

だから私は整数のシーケンスがランダムに生成されたかどうかをテストしようとしていますが、うまくいきません...これは私がこれまでに得たものです:

public static void main(String[] args) {
    Random r = new Random();
    int[] sequence = { r.nextInt(), r.nextInt(), r.nextInt() };
    System.out.println(isRandomSequence(sequence));
}

public static boolean isRandomSequence(int[] sequence) {
    for (long seed = 0; seed < Long.MAX_VALUE; ++seed) {
        Random r = new Random(seed);
        long tries = 0;
        for (int i = 0; tries < Long.MAX_VALUE; ++tries) {
            if (sequence[i] == r.nextInt()) {
                if (++i == sequence.length) return true;
            } else {
                i = 0;
            }
        }
    }
    return false;
}

編集:明確にする; たとえば、シーケンス { 4, 5, 6 } が乱数ジェネレーターによって生成されたかどうかを知りたいです。まず、テストを java.util.Random に制限します (可能であれば、一般的な解決策があるとよいでしょう)。

4

3 に答える 3

4

手に負えないことは別として、ブルートフォース手法はjava.util.Random、によって生成された疑似乱数シーケンスのみを検出します。疑似乱数を生成する唯一のオプションではありません。また、単語pseudoにも注意してください。それらは実際にはランダムではないため、シーケンスを検出できると考えられます。

シーケンスが本当にランダムかどうかを検出することは、理論的には不可能です。特定の可能性を排除するために、パターン検出テストを集中的に実行することが最善の方法です。検出を逃れるランダムでないシーケンスが常に存在します。

また、たった 3 つの整数のシーケンスについて言うべきことは何もないことにも注意してください。java.util.Randomの出力には、可能なすべての 3 整数シーケンスが含まれていると確信しています。

于 2012-12-12T20:55:18.110 に答える
2

ランダムには 2^48 シードしかありません。これは、最初から 2^48 シードを探索するだけでよいことを意味します。もういや。

とはいえ、2^48 シードを調べるには数時間から数日かかります。

これは非常に CPU を集中的に使用するため、利用可能なすべての CPU を使用して調べることができます ;)

于 2012-12-12T20:51:42.413 に答える
0

シードが正しく機能しない方法について考えていると思います。それが、ランダムなシーケンスが得られない理由を説明するかもしれません。

毎回種をまくわけではありません。プロセスの開始時にシードを使用して Random をインスタンス化し、それに固執します。

メソッド呼び出し内でランダムを作成し、シーケンスが必要になるたびに新しいシードを作成する場合、間違いなく間違っています。

私はこれがうまくいくに違いない:

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

/**
 * RandomSequenceGenerator
 * @author mduffy
 * @since 12/12/12 4:38 PM
 */
public class RandomSequenceGenerator {

    private Random random;

    public static void main(String[] args) {
        RandomSequenceGenerator generator = new RandomSequenceGenerator();
        int numSequences = ((args.length > 0) ? Integer.valueOf(args[0]) : 10);
        int lenSequence  = ((args.length > 1) ? Integer.valueOf(args[1]) : 3);
        for (int i = 0; i < numSequences; ++i) {
            System.out.println(generator.createRandomSequence(lenSequence));
        }
    }

    public RandomSequenceGenerator() {
        this(System.currentTimeMillis());
    }

    public RandomSequenceGenerator(long seed) {
        this.random = new Random(seed);
    }

    public synchronized List<Integer> createRandomSequence(int length) {
        List<Integer> sequence = new ArrayList<Integer>(length);
        for (int i = 0; i < length; ++i) {
            sequence.add(this.random.nextInt());
        }
        return sequence;
    }
}
于 2012-12-12T20:55:17.627 に答える