【发布时间】:2019-09-06 11:05:40
【问题描述】:
我有一段时间在 C# 和 C++ 地形生成器中使用了以下确定性噪声函数:
float GridNoise(int x, int z, int seed)
{
int n = (1619*x + 31337*z + 1013*seed) & 0x7fffffff;
n = (n >> 13) ^ n;
return 1 - ((n*(n*n*60493 + 19990303) + 1376312589) & 0x7fffffff)/(float)1073741824;
}
对于我输入的任何整数 x/z 坐标,它都会返回一个介于 1 和 -1 之间的“随机”浮点数(另外还有一个种子,因此我可以生成不同的地形)。我尝试在 Javascript 中实现相同的功能,但结果不如预期。对于较小的值,这似乎还可以,但是当我使用较大的值(约 10000 的数量级)时,结果的随机性越来越小,最终它返回的都是 1。
您可以看到它在 C# here 中正常工作,而同一输入 here 的 JS 结果不正确。
我怀疑这与 JS 变量不是严格整数有关,但任何人都可以阐明更多信息吗?如果这不起作用,是否有人可以在 JS 中使用类似的简单确定性函数?
【问题讨论】:
-
(n*(n*n*60493 + 19990303)+ 1376312589) & 0x7fffffff始终为 0,因为 (n*(n*n*60493 + 19990303)+ 1376312589) 就像 6e+25 - 所以,没有办法在 javascript 中工作 -
return 1 - ((n*(n*n*60493 & 0x7fffffff + 19990303) + 1376312589) & 0x7fffffff)/1073741824;将限制为 -1 ... +1
标签: javascript random noise