如何测试整数序列是否随机生成?

时间:2012-12-12 20:45:33

标签: java

所以我试图测试一个整数序列是否是随机生成的,但它不起作用...... 这是我到目前为止所得到的:

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中(如果有可能的话,可以使用通用的解决方案)。

3 个答案:

答案 0 :(得分:4)

除了难以处理之外,您的强力技术只会检测java.util.Random生成的伪随机序列,而不是生成伪随机数的唯一选择。还要注意单词 pseudo :它们并不是随机的,这就是为什么你认为你可以检测到序列。

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

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

答案 1 :(得分:2)

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

同样,探索2 ^ 48粒种子需要数小时或数天才能运行。

由于这是非常密集的,你可以看看你使用的所有CPU;)

答案 2 :(得分: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;
    }
}