如何根据x
,y
和seed
值生成相同的随机数?因此,如果您继续为x
,y
和seed
选择完全相同的值,则始终会从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;
}
答案 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)
使用添加,独占或(^
)的一些组合以及与大素数的乘法来组合seed
,x
,y
和一些大常量以获得随机整数。然后将此整数缩放到所需范围内的浮点数。
请注意随机数的质量取决于这些值的精确选择。如果你想要高质量的随机数,你需要用Diehard测试来测试它们,然后调整常数直到质量足够好。
此外,由于这些操作是线性的,因此智能对手可能会在看到其中的一些数据后预测您的随机数。如果这是一个问题,您应该使用一些加密算法来合并x
和y
以及一个密钥。