ひっと

デバッグできる乱数を生成する

~ Flashアプリ、ゲームのためのAS3サンプルプログラム集 ~

後から再現できるランダム値の生成方法

出現パターンが毎回同じになる乱数生成アルゴリズムです。
「乱数の種」の値でパターンが決まります。

Math.random()と違って再現できる乱数なので、マップの自動生成やデバッグにどうぞ。

アルゴリズムの詳細については線形合同法で検索すると出てきます。
参考にしたページ:「良い乱数・悪い乱数」

AS3 サンプル ソースコード


package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.text.TextFieldType;
    
    [SWF(width="400", height="300")]
    public class Main extends Sprite
    {

        public var MAX_RAND:uint = 32767;
        public var Xn:uint = 1;    //※オーバーフローを利用していますので型はuint型を使ってください

        //UI関連
        public var msg:TextField = new TextField();
        public var tfSeed:TextField = new TextField();
        public var btn:TextField = new TextField();
        public var tfResult:TextField = new TextField();
        
        public function Main()
        {
            msg.text = "乱数の種(整数値)=";
            msg.x=20;
            msg.y=20;
            msg.width=130;
            msg.selectable = false;
            this.addChild(msg);
            
            tfSeed.text="1";
            tfSeed.type = TextFieldType.INPUT;
            tfSeed.background = true;
            tfSeed.x=130;
            tfSeed.y=20;
            tfSeed.width = 80;
            tfSeed.height = 20;
            this.addChild(tfSeed);
            
            btn.text="計算する";
            btn.background = true;
            btn.backgroundColor = 0xAAAAAA;
            btn.selectable = false;
            btn.x=230;
            btn.y=20;
            btn.width = 50;
            btn.height = 20;
            
            btn.addEventListener(MouseEvent.CLICK, onClick );
            this.addChild(btn);
            
            tfResult.text="サイコロを振ります。ここに結果がでます。";
            tfResult.y=50;
            tfResult.width = 400;
            tfResult.height= 250;
            tfResult.wordWrap = true;
            tfResult.multiline=true;
            tfResult.selectable = false;
            this.addChild(tfResult);
            
        }
        
        public function onClick(e:MouseEvent  ):void
        {
            //600回サイコロを振った結果を表示します    
            
            //乱数の種をセット
            Srand( int(tfSeed.text) );
            
            tfResult.text = "";
            for(var i:int=0; i< 600;i++){
                var saikoro:Number = Math.floor( Randam() * 6 ) +1;
                tfResult.appendText( saikoro.toString() + "," );
            }
            tfResult.appendText( "..." );
            
        }

        //乱数の種をセット
        //乱数のパターンは乱数の種で決まります
        public function Srand(seed:int):void
        {
            Xn = seed;
        }

        //0~MAX_RANDの間で乱数を計算します
        public function Rand():int
        {
            //※このアルゴリズムはC言語(VC++)のrand()と同じ結果になります
            Xn = ( 214013*Xn + 2531011 );
            return ( ( Xn >> 16 ) & MAX_RAND );
        }

        //0以上1未満で乱数を取得します。(Math.randam()の戻り値に合わせた例)
        public function Randam():Number
        {
            return Rand() / (MAX_RAND+1);
        }
        
        
    }
}

目次へ
52888