生成相同的随机数?

时间:2015-01-10 16:28:46

标签: java random

如何根据xyseed值生成相同的随机数?因此,如果您继续为xyseed选择完全相同的值,则始终会从float向{{1}返回相同的0.0 }}。类似的东西:

1.0

修改 我想我已经找到了一种可以完成这项工作的方法(对不起,如果我问的是错误的问题):

//Returns value from 0.0 to 1.0
public static float random(int seed, int x, int y) {
    ...
    return rand;
}

4 个答案:

答案 0 :(得分:2)

Random类是伪随机序列生成器,这意味着如果使用相同的种子初始化它,它将返回完全相同的序列。因此,使用您的参数组合初始化Random并请求新的浮点数。

public static float random(int seed, int x, int y) {
    long superSeed = (seed << 32) ^ (x << 16) ^ y; // combine into a single long
    return new Random(superSeed).nextFloat();
}

<强>更新

如果我可以将您的问题解释为:&#34;我怎样才能始终从种子生成相同的地形(使用一个新的Random()调用?&#34;)然后我会使用以下内容:< / p>

public static float[][] randomTerrain(long seed, int w, int h) {
    Random random = new Random(seed);
    float[][] terrainRandom = new float[w][h];
    for (int x = 0; x < w; x += 1) {
        for (int y = 0; y < h; y += 1) {
            terrainRandom[x][y] = random.nextFloat();
        }
    }
    return terrainRandom;
}

这将每次从同一种子生成相同的随机数组。

这会将随机性存储在数组中,但您实际上可以将其整合到地形生成代码中,这样您就不必在使用之前先存储整个数组。

答案 1 :(得分:1)

取决于x和y的值范围。在您的情况下,您有两个int s,它们适合Random {)种子的long

琐碎的案例如下: 对于相同的x + y,它将返回0..1范围内的相同浮点数。但是,对于不同的组合,它也可能返回相同的浮点数。

long seed = ((long)x << 32) + y;
Random r = new Random(seed);
r.nextLong(); // discard
return r.nextFloat();

随机内部会将64位长度减少到48位状态。我会添加r.nextLong()调用,以确保你没有得到前几个字节which are biased

答案 2 :(得分:0)

Math.sin(seed + x + y)怎么样?

答案 3 :(得分:0)

使用添加,独占或(^)的一些组合以及与大素数的乘法来组合seedxy和一些大常量以获得随机整数。然后将此整数缩放到所需范围内的浮点数。

请注意随机数的质量取决于这些值的精确选择。如果你想要高质量的随机数,你需要用Diehard测试来测试它们,然后调整常数直到质量足够好。

此外,由于这些操作是线性的,因此智能对手可能会在看到其中的一些数据后预测您的随机数。如果这是一个问题,您应该使用一些加密算法来合并xy以及一个密钥。