我想创建一个表示无限(2 ^ 32可被视为无限)条带的类,其上有伪随机数。界面应该非常简单;构造函数应该获得Random
的实例;并且应该有一种方法来获取索引的随机数。
请注意,我不想存储庞大的查找表并预先计算它;我希望它能够在飞行中完成。
public class InfiniteRandomStrip {
public InfiniteRandomStrip(Random r) {
...
}
public int getNumber(int index) {
// magic code here
}
}
请注意,代码应通过以下测试:
Random seed = new Random(123);
Random seed2 = new Random(123);
InfiniteRandomStrip strip = new InfiniteRandomStrip(seed);
InfiniteRandomStrip strip2 = new InfiniteRandomStrip(seed2);
int first = strip.getNumber(454); // consume the random
if(strip.getNumber(5) == strip2.getNumber(5) )
System.out.println("TEST1 OK");
if(first == strip.getNumber(454) )
System.out.println("TEST2 OK");
我没有找到任何这种随机列表案例的例子或算法。如果这样的问题没有解决方案,我会很高兴听到解释原因。
答案 0 :(得分:1)
您可以在Random
方法中克隆getNumber
对象,以便每次都从同一种子开始。然后重复计算nextInt
,直到找到正确的索引。
int getNumber(int index) {
Random r = this.seed.clone();
for (int i = 0; i < index - 1; ++i) {
r.nextInt();
}
return r.nextInt();
}
答案 1 :(得分:1)
public class InfiniteRandomStrip {
private final long seed;
public InfiniteRandomStrip(Random r) {
this.seed = r.nextLong();
}
public int getNumber(int index) {
return new Random(seed ^ index).nextInt();
}
}