Основная проблема заключается в том, что в javascript нет целых чисел - поэтому все математические функции выполняются с использованием Number (52-битная точность с плавающей точкой)
В c #, если вы используете long, то любые переполнения просто отбрасываются
В javascript вам нужно справиться с этим самостоятельно
В браузеры приходит числовой формат, который поможет, но он еще не здесь - BigInt ... он в chrome / opera и за флагом в Firefox (рабочий стол, а не Android)
(нет слов в Edge (все равно нет) или Safari (новый IE) - и, конечно, IE никогда их не получит)
Лучшее, что я могу придумать, используя BigInt
, это
function gridNoise(x, z, seed) {
var n = (1619 * x + 31337 * z + 1013 * seed) & 0x7fffffff;
n = BigInt((n >> 13) ^ n);
n = n * (n * n * 60493n + 19990303n) + 1376312589n;
n = parseInt(n.toString(2).slice(-31), 2);
return 1 - n / 1073741824;
}
function test() {
for (var i = 10000; i < 11000; i++) {
console.log(gridNoise(0, 0, i));
}
}
test();
Примечание: 60493n
- это BigInt
обозначение
Есть промежуточные библиотеки, которые вы могли бы использовать тем временем - https://github.com/peterolson/BigInteger.js
Следующее не работает и никогда не будет ... потому что 32-битный х 32-битный == 64-битный ... так что вы уже потеряете биты
Я неправильно прочитал код, и хотя n
был только 19 бит (из-за >> 13)
Если вы ограничите результат n * n * 60493 32-битным ((на самом деле, я сделал это 31-битным ... так что ... в любом случае, похоже, что он работает хорошо
)
function gridNoise(x, z, seed) {
var n = (1619 * x + 31337 * z + 1013 * seed) & 0x7fffffff;
n = (n >> 13) ^ n;
return 1 - ((n * (n * n * 60493 & 0x7fffffff + 19990303) + 1376312589) & 0x7fffffff) / 1073741824;
}
это тоже работает
return 1 - ((n*(n*n*60493 | 0 + 19990303) + 1376312589) & 0x7fffffff)/1073741824;
Это ограничивает промежуточный результат 32 битами, которые могут быть или не быть "точными"
Возможно, вам придется поэкспериментировать с ним, если вы хотите скопировать именно то, что производит c #