有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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。随机(如果可能的话,最好有一个通用的解决方案)


共 (3) 个答案

  1. # 1 楼答案

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

    尽管如此,探索2^48颗种子将需要数小时或数天的时间

    由于这是非常cpu密集型的,您可以考虑使用所有可用的cpu;)

  2. # 2 楼答案

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

    从理论上来说,检测一个序列是否真的是随机的是不可能的:你能做的最好的事情就是执行一连串的模式检测测试,以消除某些可能性。总会有非随机序列逃脱检测

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

  3. # 3 楼答案

    我想你在想seed的工作方式不正确。这或许可以解释为什么你没有得到随机序列

    你不是每次都播种。在流程开始时,用种子实例化随机变量,并将其挂起

    如果你在一个方法调用中创建了一个随机的,每次你想要一个序列时都会有一个新的种子,那么你肯定是做错了

    我敢打赌这是有效的:

    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;
        }
    }