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一词:它们并不是真正随机的,这就是您认为可以检测到序列的原因。

检测序列是否真正随机在理论上是不可能的:您能做的最好的事情就是执行一系列模式检测测试,以消除某些可能性。总会有非随机序列逃脱检测。

我还应该注意,对于只有三个整数的序列绝对没有什么可说的。我很确定 的输出java.util.Random包含所有可能的三整数序列。

于 2012-12-12T20:55:18.110 回答
2

随机只有 2^48 个种子。这意味着您“只”需要从一开始就探索 2^48 个种子。不再。

尽管如此,探索 2^48 个种子需要数小时或数天才能运行。

由于这非常占用 CPU,因此您可以考虑使用所有可用的 CPU ;)

于 2012-12-12T20:51:42.413 回答
0

我认为您正在考虑种子的工作方式不正确。这可以解释为什么你没有得到随机序列。

你不是每次都播种。您在进程开始时使用种子实例化 Random 并挂在它上面。

如果你在方法调用中创建一个 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 回答