生成介于 -1 和 1 之间的随机数?

Generate random number between -1 and 1?

所以我找到了这个有用的网站,其中有很多代码和对 perlin 和单纯形噪声的解释。但是,代码是用不同的语言编写的。我能够为 java 重写其中的大部分内容,但是有一个函数 1. 我不明白,以及 2. 我不知道如何在 java 中编写它。代码是:

function IntNoise(32-bit integer: x)             

    x = (x<<13) ^ x;
    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    

  end IntNoise function

同样,我不知道它是用什么语言编写的。但是,作者指出函数 returns 是一个介于 -1 和 1 之间的随机数。有人可以解释一下 & 符号的确切作用?为什么会有一堆看似随机的数字?有没有一种简单的方法可以将其转换为 java?

内部对数字进行哈希处理,&/ 将此哈希转换为 0 到 2 之间的数字,因此当您执行 1 - (..) 时,您会得到一个介于 -1 之间的数字和 1.

获得-1 和 1 之间的随机数的 Java 方法是

return Math.random() * 2 - 1;

或者如果您需要使用种子

return new Random(x).nextDouble() * 2 - 1;

这种语言似乎具有非常相似的运算符,但声明不同。唯一重要的是让 Java 将这些位解释为 IEEE-754 浮点数。以下应该足够了:

float rNoise(int x){
x = (x<<13) ^ x;
return ( 1.0 - Float.floatToIntBits( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0); 
}

& 运算符将独立地对数字的每一位执行位级 AND 运算,而 ^ 将以类似的方式执行 XOR 运算。看起来 XOR 用于混合,& 用于掩码。