所以我试图测试一个整数序列是否是随机生成的,但它不起作用...... 这是我到目前为止所得到的:
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中(如果有可能的话,可以使用通用的解决方案)。
答案 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;
}
}