Генерировать случайное число от -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 используется для смешивания и & используется для маскировки.

Другие вопросы по тегам