Actionscript: создание псевдослучайного числа с семенами
Я создаю функцию, которая возвращает номер шума Perlin во Flash. Для этой функции у меня должна быть функция, которая возвращает случайное число из статического начального числа. К сожалению, Math.random по умолчанию в Actionscript не может этого сделать..
Я долго искал в интернете и не смог найти решение, которое бы соответствовало моей функции перлин-шума.
Я попробовал следующие коды:
public static var seed:int = 602366;
public static function intNoise(x:int, y:int):Number {
var n:Number = seed * 16127 + (x + y * 57);
n = n % 602366;
seed = n | 0;
if (seed <= 0) seed = 1;
return (seed * 0.00000166) * 2 - 1;
}
Эта функция создает случайное число, но начальное число постоянно меняется, поэтому это не работает с шумом перлина.
public static function intNoise(x:int, y:int):Number {
var n:Number = x + y * 57;
n = (n<<13) ^ n;
return ( 1 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0);
}
Я получил эту функцию из учебника Perlin Noise, которому я следовал: Perlin Noise, но, похоже, он возвращает только 1.
Как я могу создать функцию, которая всегда возвращает одно и то же псевдослучайное число при вызове с одним и тем же начальным числом?
1 ответ
Я посмотрел на генератор случайных чисел, упомянутый в ссылке, и это выглядит так:
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
Я перевел это так:
package
{
import flash.display.*;
public class Main extends Sprite {
private var seeds:Array =
[ -1000, -999, -998, 7, 11, 13, 17, 999, 1000, 1001 ];
public function Main() {
for ( var i:int = 0; i < 10; i++ )
trace( intNoise( seeds[ i ] ) );
// Outputs: 1, 0, 0, -0.595146656036377, -0.1810436248779297,
// 0.8304634094238281, -0.9540863037109375, 0, 0, 1
}
// returns floating point numbers between -1.0 and 1.0
// returns 1 when x <= -1000 || x >= 1001 because b becomes 0
// otherwise performs nicely
public function
intNoise( x:Number ):Number {
x = ( uint( x << 13 ) ) ^ x;
var a:Number = ( x * x * x * 15731 + x * 789221 );
var b:Number = a & 0x7fffffff;
return 1.0 - b / 1073741824.0;
}
}
}