Javascript-这个噪波函数可以工作吗? 我有一个确定性的噪声函数,我在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; }

Javascript-这个噪波函数可以工作吗? 我有一个确定性的噪声函数,我在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; },javascript,random,noise,Javascript,Random,Noise,对于我输入的任何整数x/z坐标,它返回一个介于1和-1之间的“随机”浮点,加上一个种子,我可以生成不同的地形。我尝试在Javascript中实现相同的函数,但结果并不像预期的那样。对于较小的值,它似乎是可以的,但当我使用大约10000的较大值时,结果越来越不随机,最终它返回的结果都是1 您可以看到它在C中正常工作,并且对于相同的输入,JS结果不正确 我怀疑这与JS变量不是严格整数有关,但有人能解释得更清楚吗?如果JS不起作用,有没有人有类似的简单确定性函数可以在JS中使用?恐怕您的代码超出了整数

对于我输入的任何整数x/z坐标,它返回一个介于1和-1之间的“随机”浮点,加上一个种子,我可以生成不同的地形。我尝试在Javascript中实现相同的函数,但结果并不像预期的那样。对于较小的值,它似乎是可以的,但当我使用大约10000的较大值时,结果越来越不随机,最终它返回的结果都是1

您可以看到它在C中正常工作,并且对于相同的输入,JS结果不正确


我怀疑这与JS变量不是严格整数有关,但有人能解释得更清楚吗?如果JS不起作用,有没有人有类似的简单确定性函数可以在JS中使用?

恐怕您的代码超出了整数的最大大小限制。一旦发生这种情况,它就会返回1,因为计算n*n*n*60493+19990303+1376312589&0x7fffffff/1073741824将始终为0-因此1-0=1

基本问题是,在javascript中,没有整数-因此所有数学函数都使用52位精度浮点完成

在c语言中,如果使用long,则所有溢出都将被丢弃

在javascript中,您需要自己处理这个问题

有一种数字格式即将出现在浏览器上,这将有所帮助,但它还没有出现-。。。它在chrome/opera浏览器中,在firefox桌面的一个标志后面,而不是android

没有任何关于边缘死亡或狩猎的新IE的消息-当然,IE永远不会得到它们

我能想到的最好的使用BigInt的方法是

函数gridNoisex,z,seed{ 变量n=1619*x+31337*z+1013*seed&0x7fffff; n=BigIntn>>13^n; n=n*n*n*60493n+19990303n+1376312589n; n=parseIntn.ToString 2.slice-31,2; 返回1-n/1073741824; } 功能测试{ 对于变量i=10000;i<11000;i++{ console.loggridNoise0,0,i; } }
试验 编辑“对不起,前面的回答不好”: 正如前面其他人所说的,问题也与您的值有关,这些值超过了JS编号的大小。
如果您的代码是用C编写的,那么最好将功能卸载到ASP.NET后端,该后端将处理计算并通过某种API转发结果。要了解这里发生了什么,必须检查JavaScripts编号类型。它基本上是一个53位整数,使用另一个11位整数进行左/右移位,得到一个64位数字。因此,如果您的计算结果是54位整数,则只需取上面的53位,并将其向左移位1。现在,如果你对数字进行逐位计算,它将占用较低的32位。因此,如果一个整数大于84位,对其进行逐位移位将始终得到0。因此,在执行逐位运算时,JS中大于32位的数字将趋向于0,而C总是取较低的32位,因此,对于那些32位,结果将是准确的,但无法表示较大的数字

  (2 + 2 ** 53) & (2 + 2 ** 53)  // 2
  (2 + 2 ** 54) & (2 + 2 ** 54) // 0

n*n*n*60493+19990303+1376312589&0x7fffffff总是0,因为n*n*n*60493+19990303+1376312589类似于6e+25——因此,在javascriptreturn 1-n*n*n*60493&0x7FFFFFFFFF+19990303+1376312589&0x7FFFFFFFFF/1073741824中没有办法工作;将限制为-1+我的意思是不要承诺。抱歉弄糊涂了不,即使你错了。。。你的代码甚至不是Javascript哦,你的权利。我不应该在与ppl XDL聊天时回答茶歇上的问题。你知道你可以删除答案吗?这可能应该被删除,因为1不是JavaScript 2,如果它应该是typescript,它包含SyntaxErrors 3它谈论承诺,但在代码中根本不使用承诺4问题与承诺无关5它在JS和CUN中对执行做出错误陈述幸运的是,从bigint中获取较低的32位并不是那么容易。parseIntbigint.toString2.slice-32,可能有2个work@JonasWilms-就这么简单:注意,在代码中只有31位&0x7fffffff