Java 无限条上指数的伪随机性

Java 无限条上指数的伪随机性,java,algorithm,random,Java,Algorithm,Random,我想创建一个类,它表示一个无限(2^32可以被认为是无限)带,带上有伪随机数。界面应该非常简单;构造函数应该得到一个Random的实例;应该有一种方法来获取索引的随机数 注意,我不想存储一个巨大的查找表并预先计算它;我希望这件事能马上完成 public class InfiniteRandomStrip { public InfiniteRandomStrip(Random r) { ... } public int getNumber(int inde

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

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

您可以在
getNumber
方法中克隆
Random
对象,以便每次从同一种子开始。然后重复计算
nextInt
,直到找到正确的索引

int getNumber(int index) {
    Random r = this.seed.clone();
    for (int i = 0; i < index - 1; ++i) {
        r.nextInt();
    }
    return r.nextInt();
}
int getNumber(int索引){
Random r=this.seed.clone();
对于(int i=0;i
好的,那么你真正的问题是什么?关于你已经为此编写的代码?我还没有实现代码,我正在寻找
magic code
,这将是有效的。在2k声誉下,你应该知道stackoverflow是关于“你尝试了什么”。那么:你尝试过什么?我已经提到,我不想存储一个巨大的查找表。我正在寻找对条带所有值的“随机访问”。不,您所说的是“这是我的要求,但我没有代码显示它”。那么:你试过什么?在寻求他人帮助之前,你自己在解决这个问题上的尝试是什么?你在问题中从未提到过负数。我相当肯定,如果不存储你在问题中说不可能做到的数字序列,你就无法更有效地完成这项工作。
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();
    }
}