首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Actionscript:使用种子创建伪随机数

Actionscript:使用种子创建伪随机数
EN

Stack Overflow用户
提问于 2012-11-25 23:19:31
回答 1查看 832关注 0票数 2

我正在创建一个函数,它在Flash中返回一个Perlin噪波数。对于这个函数,我必须有一个从静态种子返回随机数的函数。不幸的是,Actionscript中的默认Math.random不能做到这一点。

我在互联网上搜索了很长一段时间,也没有找到适合我的perlin-noise函数的解决方案。

我尝试了以下代码:

代码语言:javascript
复制
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;
}

这个函数确实创建了一个随机数,但是种子一直在变化,所以这不适用于perlin噪声。

代码语言:javascript
复制
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。

如何创建一个函数,使其在使用相同的种子调用时始终返回相同的伪随机数?

EN

回答 1

Stack Overflow用户

发布于 2013-02-06 15:14:17

我看了链接中提到的随机数生成器,它看起来是这样的:

代码语言:javascript
复制
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

我是这样翻译的:

代码语言:javascript
复制
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; 
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13552354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档