Fisher-Yatesアルゴリズムでシャッフル

by takimo
♥0 | Line 81 | Modified 2010-01-07 10:36:10 | MIT License
play

ActionScript3 source code

/**
 * Copyright takimo ( http://wonderfl.net/user/takimo )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/mFWO
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.events.MouseEvent;
    	import flash.text.TextFormat;
    
    public class FisherYatesTest extends Sprite {
    		private var _debug:TextField;
    		
        public function FisherYatesTest() {
        	    _debug = new TextField();
        	    _debug.text = " ";
        	    var format:TextFormat = new TextFormat();
        	    format.font = '_等幅';
        	    format.size = 10;
            _debug.height = 400;
            _debug.width = 400;
            _debug.border = true;
            _debug.text = "どのくらいバラけるかのテスト、画面をクリックすると再度シャッフルされます。\n";
            _debug.setTextFormat(format);
            this.addChild(_debug);
            _debug.appendText("");
            
            start();
            stage.addEventListener(MouseEvent.CLICK, stage_clickHandler);
        }
        
        public function start():void
        {
            var results:Array = new Array();
            var array:Array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29];
            var loop:int = 30;
            
            for(var h:int = 0;h < loop; h++)
            {
            		results[h] = [];
            		for(var g:int = 0;g < array.length; g++)
            		{
            			results[h][g] = 0;
            		}
            }
  
            for (var i:int = 0; i < loop; i++)
            {
            		var shuffle:Array = ArrayUtils.shuffle(array);
            		for (var j:int = 0; j < shuffle.length; j++)
            		{
            			var number:int = shuffle[j];
            			results[j][number]++;
            		}
            }
            
			for (var k:int = 0; k < results.length; k++)
			{
				var tmp:Array = results[k];
				
				for (var l:int = 0; l < tmp.length; l++)
					if(tmp[l])
						_debug.appendText("■");
					else
						_debug.appendText("□");
				
				_debug.appendText("\n");
			}

        }
        
        public function stage_clickHandler(event:MouseEvent):void
        {
        		_debug.text = "\n";
        		start();
        }
    }
}

class ArrayUtils
{  
    public static function shuffle(array:Array):Array
	{
	        var result:Array = array.concat();
	        var i:int = result.length;
	        var j:int;
	        var tmp:Object;
		
	        while (i)
	        {
                j = Math.floor(Math.random() * i);
                tmp = result[--i];
                result[i] = result[j];
                result[j] = tmp;
	        }
		
	        return result;
	}
}