Генерировать случайное число от -1 до 1?
Так что я нашел этот полезный сайт с большим количеством кода и объяснений перлин и симплексного шума. Однако код написан на другом языке. Я был в состоянии переписать большую часть этого для 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
Опять же, я не знаю, на каком языке это написано. Однако автор заявляет, что функция возвращает случайное число от -1 до 1. Может кто-нибудь объяснить, что именно делает символ &? И почему существует куча, казалось бы, случайных чисел? И есть ли простой способ преобразовать это в Java?
2 ответа
Внутренняя часть хеширует число, &
а также /
превращает этот хеш в число от 0 до 2, поэтому, когда вы делаете 1 - (..)
Вы получите число от -1 до 1.
Java способ получить случайное число от -1 до 1
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);
}
&
Оператор будет выполнять операцию уровня битов И над каждым битом числа независимо, в то время как ^
выполнит операцию XOR аналогичным образом. Похоже, XOR используется для смешивания и &
используется для маскировки.