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。随机(如果可能的话,最好有一个通用的解决方案)
# 1 楼答案
Random只有2^48个种子。这意味着你从一开始就“只”需要探索2^48个种子。没有了
尽管如此,探索2^48颗种子将需要数小时或数天的时间
由于这是非常cpu密集型的,您可以考虑使用所有可用的cpu;)
# 2 楼答案
除了难以处理之外,你的蛮力技术只会检测由
java.util.Random
生成的伪随机序列,这远不是生成伪随机数的唯一选项。还要注意单词pseudo:它们不是真正随机的,这就是为什么你认为你可以检测序列从理论上来说,检测一个序列是否真的是随机的是不可能的:你能做的最好的事情就是执行一连串的模式检测测试,以消除某些可能性。总会有非随机序列逃脱检测
我还应该指出,对于一个只有三个整数的序列,绝对没有什么可说的。我很确定
java.util.Random
的输出包含所有可能的三个整数序列# 3 楼答案
我想你在想seed的工作方式不正确。这或许可以解释为什么你没有得到随机序列
你不是每次都播种。在流程开始时,用种子实例化随机变量,并将其挂起
如果你在一个方法调用中创建了一个随机的,每次你想要一个序列时都会有一个新的种子,那么你肯定是做错了
我敢打赌这是有效的: