使用整数向量生成随机数作为Java中的种子

时间:2011-05-08 19:45:07

标签: java random numbers random-seed

我想生成可再现的随机数,表示三维空间中不同点的数量,例如

double draw = rand(int seed, int x, int y, int z)

我希望相同的输入始终产生相同的绘制。我不想提前生成所有值,因为会有太多。

我希望不同职位的平局是独立的。我也希望不同种子的相同位置的绘制是独立的。这排除了取四个参数的总和或乘积,并将其用作种子。

4 个答案:

答案 0 :(得分:0)

怎么样

return new Random(seed ^ x ^ y ^ z).nextDouble();

(因为构造函数的种子参数实际上是64位,你可以得到更好的“扩展”,比如在xor:ing之前将你的两个整数向上移位32位)


另一个简单的解决方案是做类似

的事情
Random rnd = new Random(seed);
rnd.setSeed(rnd.nextLong() ^ x);
rnd.setSeed(rnd.nextLong() ^ y);
rnd.setSeed(rnd.nextLong() ^ z);
return rnd.nextDouble();

答案 1 :(得分:0)

Java有Random(long seed)构造函数,但它只需要一个long值。

但是你不必担心,因为你可以将(数学)函数应用于向量和种子以产生单个数字。一个穷人的版本只是添加数字:

 Random rand = new Random(seed+x+y+z);

但是你可能已经注意到了自己,这不是最好的,因为它为(1,0,0)和(0,1,0)和(0,0,1)产生相同的结果。我相信你可以想出更好的功能,比如seed + 31*31*x + 31*y + z或类似的。

答案 2 :(得分:0)

setSeed() API所述,java.util.Random使用48位种子。您的模型可能建议定义一个合适的函数来散列您的三个整数。或者,您可以使用自定义实现扩展java.util.Random

答案 3 :(得分:0)

Random类使用48位种子,每个种子可以方便地分成三个16位,就像这样。

private static long createSeed(long x, long y, long z) {
    return (z & 0xffff) << 32 + (yy & 0xffff) << 16 + (x & 0xffff);
}