有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

无限条上索引的java伪随机

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

  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();
        }
    }
    
  2. # 2 楼答案

    可以在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();
    }