Java 生成相同的随机数?

Java 生成相同的随机数?,java,random,Java,Random,如何根据x、y和种子值生成相同的随机数?因此,如果您一直为x、y和seed选择完全相同的值,它将始终从0.0返回相同的float。比如: //Returns value from 0.0 to 1.0 public static float random(int seed, int x, int y) { ... return rand; } 编辑: 我想我已经找到了一种可以完成这项工作的方法(如果我问错了,我很抱歉): publicstaticfloatrandom(intx

如何根据
x
y
种子值生成相同的随机数?因此,如果您一直为
x
y
seed
选择完全相同的值,它将始终从
0.0
返回相同的
float
。比如:

//Returns value from 0.0 to 1.0
public static float random(int seed, int x, int y) {
    ...
    return rand;
}
编辑: 我想我已经找到了一种可以完成这项工作的方法(如果我问错了,我很抱歉):

publicstaticfloatrandom(intx,inty){
int n=x+y*57;

n=(n数学怎么样?
sin(seed+x+y)

取决于x和y的值范围。在您的例子中,有两个
int
s,它们确实适合随机()种子的
long

这个简单的例子如下所示: 对于相同的x+y,它将返回0..1范围内的相同浮点值。但是,对于不同的组合,它也可能返回相同的浮点值

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

long seed=((long)x使用加法、异或(
^
)和与大素数相乘的组合,将
seed
x
y
和一些大常量组合在一起,得到一个随机整数。然后将该整数缩放到所需范围内的浮点值

请注意,随机数的质量取决于这些值的精确选择。如果您想要高质量的随机数,您需要使用类似于顽固测试的方法对其进行测试,并修改常量,直到质量足够好


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

随机
类是一个伪随机序列生成器,这意味着如果使用相同的种子初始化它,它将返回完全相同的序列。因此,使用参数组合初始化
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();
}
publicstaticfloatrandom(int-seed,int-x,int-y){


long superSeed=(seed您想用它做什么?三个值生成相同的数字不是生成一个随机数number@starblue对于terrain gen,因此值必须始终相同“不使用new Random()你是在问如何实现你自己的伪随机数生成器吗?如果是的话,读@ BLAM,这就是伪随机生成器的作用:随机分布的可重复结果。把所有三个输入看作是同一个种子的一部分。随机生成器,但我认为这是令人毛骨悚然的(此外,不是每个人都知道随机与伪随机)如果种子为零,它将始终返回零。@命名它仍然实现了指定的目标。@bum除了它不再是随机的之外,所以不,它不再是随机的t@name这不是你想要的-返回相同的数字吗?好的,我更改了它,使它取决于所有三个…@说出一个数字,它总是和你要求的一样,无论如何都不是随机的。R随机数是随机的,因为它们无法预测。你称之为“随机数”是什么数字?我已经有了种子,还有x和y值,我需要组合x,y和种子值来创建一个从0.0到1.0的随机数。你的问题没有提到你的种子。它有什么函数?你可以将它与上面的种子进行异或。是的,这似乎与我曾经看到的类似。谢谢,我会稍微弄乱它。是的,那是这就是我要找的。除了
new Random()
。我会经常调用此方法,所以我不希望每秒有数百次分配。这是无法避免的,除非你能接受这样一个事实,即为整个地形播种一次。我“我将更新我的答案。嗯,随机类如何生成数字?也许复制该方法是一种解决方法?我可以阻止它生成'next'int。您不必复制它,因为您只需使用
Random
类。构造
新随机(种子)
一次,并继续请求
nextFloat()
。诀窍是始终以相同的顺序请求它们。顺便说一句,如果您可以显示使用地形生成代码,我们可以帮助您集成种子随机性。
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();
}
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;
}