AS3で配列/数値のシャッフルや乱数生成を行う「Randomize」クラス

Randomize

Randomize

ActionScript3.0で配列/数値のシャッフルや乱数生成を行う「Randomize」クラスを作成しました。

静的クラスメンバ“shuffleArray”は指定した配列要素の順序をシャッフルして返し、静的クラスメンバ“shuffle”は指定した範囲内の数値をシャッフルし配列として返します。*1

静的クラスメンバ“exactRandom”は除外指定した数値以外の乱数を返し、静的クラスメンバ“range”は指定した範囲内の乱数を返します。

下記のボタンより、サンプルの閲覧およびソースのダウンロードができます。

Sample Download

【使用例】

myArrayの要素をシャッフルし、shuffledArrayへ代入する


var myArray:Array = [1, 3, 5, 7, 9]
var shuffledArray:Array = Randomize.shuffleArray(myArray);

1〜12までの数値をシャッフルし、
12個の要素を持つ配列として shuffledArrayへ代入する


var shuffleMin:uint = 1;
var shuffleMax:uint = 12;
var shuffledArray:Array = Randomize.shuffle(shuffleMin, shuffleMax);

1〜12までの乱数を取得し、myUintへ代入する
(ただし exceptUintと同じ数値である 1は返らない)


var exceptUint:uint = 1;
var randomMin:uint = 1;
var randomMax:uint = 12;
var myUint:uint =
Randomize.exactRandom(exceptUint, randomMin, randomMax);

1〜12までの乱数を取得し、myUintへ代入する


var randomMin:uint = 1;
var randomMax:uint = 12;
var myUint:uint =
Randomize.range(randomMin, randomMax);

【パラメータ説明: “shuffleArray”】

arr


要素の順序をシャッフルする配列
[Array][省略不可]

【パラメータ説明: “shuffle”】

shuffleMin


シャッフルする数値の最小値
[int][省略不可]

shuffleMax


シャッフルする数値の最大値
[int][省略不可]

【パラメータ説明: “exactRandom”】

exceptInt


戻り値の乱数から除外する数値
[int][省略不可]

randomMin


乱数の最小値
[int][省略不可]

randomMax


乱数の最大値
[int][省略不可]

【パラメータ説明: “range”】

randomMin


乱数の最小値
[int][省略不可]

randomMax


乱数の最大値
[int][省略不可]

ソースコード

import jp.atziluth.utils.Randomize;


package jp.atziluth.utils{
public class Randomize {
private static var shuffleList:Array = [];
private static var shuffleNum:uint;
private static var tempList:Array = [];
private static var tempInt:int;
public static function shuffleArray(arr:Array):Array {
Randomize.shuffleList = arr;
Randomize.shuffleNum = Randomize.shuffleList.length;
while (Randomize.shuffleNum) {
var m:int = Math.floor(Math.random() * Randomize.shuffleNum);
var n:int = Randomize.shuffleList[--Randomize.shuffleNum];
Randomize.shuffleList[Randomize.shuffleNum] = Randomize.shuffleList[m];
Randomize.shuffleList[m] = n;
}
return (Randomize.shuffleList);
}
public static function shuffle(shuffleMin:int, shuffleMax:int):Array {
for (var i:uint; i<shuffleMax; i++) {
Randomize.tempList[i] = i + shuffleMin;
}
Randomize.shuffleList = Randomize.shuffleArray(Randomize.tempList);
return (Randomize.shuffleList);
}
public static function exactRandom(exceptInt:int, randomMin:int, randomMax:int):int {
do {
Randomize.tempInt = Randomize.range(randomMin,randomMax);
} while (Randomize.tempInt==exceptInt);
return (Randomize.tempInt);
}
public static function range(randomMin:int, randomMax:int):int {
var i:int = Math.floor(Math.random()*(randomMax-randomMin+1))+randomMin;
return (i);
}
}
}

サンプルソースコード】

Sample.as


package {
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFormat;
import jp.atziluth.gui.RelativeLayout;
import jp.atziluth.utils.Randomize;
[SWF(width=420, height=262, backgroundColor=0x000000, frameRate=12)]
public class Sample extends Sprite {
//シャッフルする配列
internal var myArray:Array = [111,222,333,444,555,666,777,888,999];
//シャッフル・ランダム出力する値の最大値
internal var randomizeMax:int = myArray.length;
//シャッフル・ランダム出力の最大値
internal var randomizeMin:int = 1;
//ランダム出力で除外する数値
internal var randomizeExcept:int;
private var randomizeTimer:Timer = new Timer(3000,0);
protected var randomizeTimerCount:uint = 1;
protected var resultExpression:Sprite = new Sprite();
private var resultTextField:TextField = new TextField();
private var resultTextFormat:TextFormat = new TextFormat();
public function Sample():void {
//ステージのプロパティ登録
setStageProperty();
//ステージのイベントリスナー登録
setStageEvents();
//出力結果を表示するコンテナの追加
addResultExpression();
//テキストフィールドのフォーマット設定
setResultTextFormat();
//テキストフィールドの設定および出力結果の代入
setResultTextField();
//テキストフィールドをコンテナへ追加
addResultTextField();
//1度目のトレース出力
traceRandomizeResult();
//出力結果を一定間隔で更新するタイマーの定義
setRandomizeTimer();
//タイマー開始
startRandomizeTimer();
//予めコンテナのレイアウトを1度実行する
centeringLayout();
}
internal function setStageProperty():void {
//ステージの伸縮を「拡大・縮小なし」に設定
stage.scaleMode = StageScaleMode.NO_SCALE;
//ステージの位置を「左上」に設定
stage.align = StageAlign.TOP_LEFT;
}
private function setStageEvents():void {
//ステージリサイズ時のイベントリスナー登録
stage.addEventListener(Event.RESIZE,centeringLayout);
}
private function addResultExpression():void {
addChildAt(resultExpression, 0);
}
private function setResultTextFormat():void {
resultTextFormat.font = "_sans";
resultTextFormat.color = 0xFFFFFF;
resultTextFormat.size = 12;
resultTextFormat.leading = 4;
}
private function setResultTextField():void {
resultTextField.autoSize = "left";
resultTextField.multiline = true;
resultTextField.wordWrap = false;
resultTextField.selectable = false;
resultTextField.mouseWheelEnabled = false;
resultTextField.defaultTextFormat = resultTextFormat;
resultExpressionText = result;
}
private function addResultTextField():void {
resultExpression.addChildAt(resultTextField,0);
}
private function set resultExpressionText(resultStr:String):void {
resultTextField.htmlText = resultStr;
}
internal function get result():String {
return (
"---------------------------------------------------------------------------------------------"+"\n"+
"[Fase: "+randomizeTimerCount+"]"+"\n"+
"Randomize.shuffleArray: "+
Randomize.shuffleArray(myArray)+"\n"+
"Randomize.shuffle: "+
Randomize.shuffle(randomizeMin, randomizeMax)+"\n"+
"Randomize.exactRandom: "+
Randomize.exactRandom(
randomizeExcept,
randomizeMin,
randomizeMax
)+"\n"+
"Randomize.range: "+
Randomize.range(
randomizeMin,
randomizeMax
)+"\n"+
"---------------------------------------------------------------------------------------------"
);
}
private function traceRandomizeResult():void {
trace(result);
}
private function setRandomizeTimer():void {
randomizeTimer.addEventListener(TimerEvent.TIMER, displayRandomizeResult);
}
private function startRandomizeTimer():void {
randomizeTimer.start();
}
private function displayRandomizeResult(event:TimerEvent):void {
//タイマーが実行された回数を randomizeTimerCountへ代入
randomizeTimerCount = event.target.currentCount + 1;
//トレース出力
traceRandomizeResult();
//テキストフィールド更新
resultExpressionText = result;
}
protected function centeringLayout(event:Event=null):void {
//コンテナをステージ中央へ配置
RelativeLayout.setPos(stage, resultExpression, "cm");
}
}
}

Download

*1:シャッフルの方式には Fisher-Yatesのアルゴリズムを使用しています