无限条带上索引的伪随机

时间:2014-11-15 07:15:47

标签: java algorithm random

我想创建一个表示无限(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");

我没有找到任何这种随机列表案例的例子或算法。如果这样的问题没有解决方案,我会很高兴听到解释原因。

2 个答案:

答案 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();
    }
}