乱数生成ライブラリ

基本的にはMath.random()を強化したものばっかりです。
使い方?ソースコードに。

基本的にはMath.random()を強化したものばっかりです。
使い方?ソースコードに。

  • タグ:
  • タグはありません
/*
	このライブラリについて。
	
	名称:Random Class Library JS
	作成者:がお(Twitterは「gaogao_9」)
	作成日:2012/03/15
	バージョン:1.00
	著作権:煮るなり焼くなり。
	これ何?:よく使いそうな種類の乱数を生成するのを簡単にするためのライブラリです。
	使い方:実行するプログラムよりも上部にこのスクリプトを外部呼出ししてお使いください。
	
	リファレンス
	RandomClass:このライブラリの肝。(例)var RandObj = new RandomClass(arg);とお使いください。
		引数一覧
		・一切引数を指定しなかった場合:(例)new RandomClass();
			minを0、maxを1として扱います。
		・1つだけ指定した時:(例)new RandomClass(max);
			0≦num≦max-1の範囲の整数乱数を生成できるオブジェクトを作ります。(配列にどうぞ)
		・2つ指定した時:(例)new RandomClass(max,min);
			min≦num≦maxの範囲の整数乱数を生成できるオブジェクトを作ります。(最大値も含むので注意)
		・それ以上指定した時:(例)new RandomClass(a,b,c,d,e);
			前二つだけを拾います。第一引数をmax、第二引数をminとして扱います。
	
	RandomClass->setMax:最大値をセットできます。(例)RandObj.setMax(5);
	RandomClass->setMin:最小値をセットできます。(例)RandObj.setMin(2);
	RandomClass->getNumber:乱数を取得します。(例)RandObj.getNumber();  //2≦num≦5の整数乱数1つ。
		引数一覧
		・一切引数を指定しなかった場合:(例)RandObj.getNumber();
			min≦num≦maxの範囲内で、乱数を一つ取り出します。
		・1つだけ指定した時:(例)RandObj.getNumber(times);
			min≦num≦maxの範囲内で、times個の乱数を、重複を認めて配列として返します。
		・2つ指定した時:(例)RandObj.getNumber(times,isRepeated);
			第二引数が真であれば、min≦num≦maxの範囲内で、times個の乱数を、重複を認めずに配列として返します。
			第二引数が偽ならば、1つだけ指定した場合と同様の動きになります。
		・それ以上指定した時:(例)RandObj.getNumber(a,b,c,d,e);
			前二つだけを拾います。第一引数をtimes、第二引数をisRepeatedとして扱います。
	
	Array.randomChoice():配列から要素をランダムに取り出します。
		引数一覧(例では、「var Arr = ["t","e","x","t"]」とする。)
		・一切引数を指定しなかった場合:(例)var Output = Arr.getNumber();
			配列の中身をランダムに並び替えます。Outputに結果が代入されます。(非破壊的)
		・1つだけ指定した時:(例)var Output = Arr.getNumber(length);
			配列の中身からlength個の要素をランダムに取り出します。Outputに結果が代入されます。(非破壊的)
		・2つ指定した時:(例)var Output = Arr.getNumber(length,isBreak);
			第二引数が真であれば、length個の要素をランダムに取り出します(破壊的)
			第二引数が偽ならば、1つだけ指定した場合と同様の動きになります。(非破壊的)
		・それ以上指定した時:(例)var Output = Arr.getNumber(a,b,c,d,e);
			前二つだけを拾います。第一引数をlength、第二引数をisBreakとして扱います。
*/

Array.prototype.randomChoice = function(input,flag){
	var length = input || this.length;
	var output = [];
	var baseArray = (flag) ? this : this.concat(); //(真)破壊的に作成(ポインタ) (偽)非破壊的に作成(クローン)
	var index;
	
	for(var i=0;i<length;++i){
		index = Math.floor(Math.random()*baseArray.length);
		output.push(baseArray[index]); //ベースのindex番目をoutputに追加
		baseArray.splice(index,1); //ベースのindex番目を削除
	}
	return output;
};

var RandomClass = function(){ //JSのオブジェクト指向って変だよね。
	/*エラー処理関連(デバッグ用)*/
	var throwError = function(){
		var isIE = !-[1,];//IE8以下でtrue,それ以外はfalse
		var err;
		if(isIE){ //IEでの挙動。
			switch(arguments.length){
				case 1:
					err = new Error("RandomClass : " + arguments[0]);
					break;
				case 2:
					err = new Error("RandomClass->" + arguments[0] + " : " + arguments[1]);
					break;
				default:
					err = new Error("RandomClass->throwError : エラーが投げられてないか、引数が多すぎです。");
					break;
			}
		}
		else{ //それ以外のブラウザの挙動。
			err = new Error();
			switch(arguments.length){
				case 1:
					err.name     = "RandomClass";
					err.message  = arguments[0];
					break;
				case 2:
					err.name     = "RandomClass->" + arguments[0];
					err.message  = arguments[1];
					break;
				default:
					err.name     = "RandomClass->throwError";
					err.message  = "エラーが投げられてないか、引数が多すぎです。";
					break;
			}
		}
		throw err;
	};
	/*エラー処理関連ここまで*/
	
	/*以下メイン部分*/
	var min,max,RandomNumber;
	var init = function(){
		this.setMax(arguments[0]);
		this.setMin(arguments[1]);
	};
	
	this.setMax = function(num){
		max = (!isNaN(num-0)) ? Math.round(num) : 1;
	};
	this.setMin = function(num){
		min = (!isNaN(num-0)) ? Math.round(num) : 0;
	};
	this.getNumber = function(times,isRepeated){
		if(min>max){
			var temp = min;
			min = max;
			max = temp;
		}
		var range = (max-min)+1;
		times = (!isNaN(times-0)) ? Math.round(times) : 1;
		if(times>1){ //2個以上の乱数を取り出すならば
			RandomNumber = [];
			if(isRepeated){
				if(times>range){
					throwError("getNumber","数値の範囲に対する取り出し回数が多すぎます。重複フラグを消すか、範囲・取り出し回数を見直してください。")
				}
				else{
					var baseArray = [];
					if(min){
						for(var i=min;i<=max;++i){
							baseArray.push(i);
						}
					}
					else{
						for(var i=min;i<max;++i){
							baseArray.push(i);
						}
					}
					RandomNumber = baseArray.randomChoice(times,true);
				}
			}
			else{
				for(var i=0;i<times;++i){
					if(min){
						RandomNumber.push(Math.floor(Math.random()*range)+min);
					}
					else{
						RandomNumber.push(Math.floor(Math.random()*(range-1))+min);
					}
				}
			}
		}
		else{
			if(min){
				RandomNumber = Math.floor(Math.random()*range)+min;
			}
			else{
				RandomNumber = Math.floor(Math.random()*(range-1))+min;
			}
		}
		return RandomNumber;
	};
	
	this.toString = function(num){
		if(RandomNumber){ //乱数を生成した経緯があり、引数が省略されているあるいは数値であれば
			if(num==null){
				return RandomNumber.toString();
			}
			
			if(!isNaN(num-0)){
				return RandomNumber.toString(num-0);
			}
			else{
				return "Random Class";
			}
		}
		else{
			return "Random Class";
		}
	};
	init.apply(this,arguments);//initをthisとして実行する。(init関数内でもRandom Class関数扱い【継承】)
};