配列から重複せずに値を取り出す

最近クイズを作る機会が何度かありまして、総数20問から7問を重複しないよう抜き出して順番に表示していくというようなことをしました。その時に作ったクラスです。

配列から重複せずにn個取り出して新しい配列を返すRandomExtractクラス

package
{	
	public class RandomExtract
	{
		/**
		 * コンストラクタ
		 *
		 * @access public
		 * @param 
		 * @return void
		 */
		public function RandomExtract():void
		{
		}
	
		/**
		 * ランダムに配列の値を取り出す
		 *
		 * @access public
		 * @param array 元になる配列
		 * @param num 取り出す配列の個数
		 * @return Array
		 */
		public static function random(array, num):Array
		{
			var a:Array = array;
			var t:Object = {};
			var r:Array = [];
			var l:int = a.length;
			var n:int = num < l ? num : l;
			while (n-- > 0) {
				//配列の数からランダムな値を作成
				var i = Math.random() * l | 0;
				r[n] = t[i] || a[i];
				//  t[i]がundefinedにならない処理
				--l;
				t[i] = t[l] || a[l];	
			}
			return r;			
		}
	}
}

例えば10個の配列から3個の値を取り出したい時は以下のように記述します。

import RandomExtract;

var arr:Array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var num:int = 3;

var newArr:Array = RandomExtract.random(_arr, _num);
trace(newArr + "が取り出されるんだぜ");	

出力結果はこんな感じです。

2,1,6が取り出されるんだぜ

参考サイトがあってそこのコードを自分に分かりやすいように書き換えただけなのですが、どこだったか分からなくなってしまいました。見つけたら追記します。

[9/21 追記]
ムダにRandomExtractクラスをインスタンス化していたのでrandomメソッドをstaticに修正。

月曜日はかせきさいだぁ≡

kaseki

かせきさいだぁ≡がライブをやるらしい
よ。しかも無料!こりゃ行くっきゃねー

以下コピペ。

——————————————————————————————————————————–

Date : 2009/09/21 (Mon) 15:00 〜 19:00
Door : FREE!!
– LIVE,DJ & SLIDE SHOW!! –

LIVE〉かせきさいだぁ≡ & HUGTONES / Baby & CIDER
DJ〉カジヒデキ / 川辺ヒロシ / 渡辺俊美 / やついいちろう(エレキコミック)
SLIDE SHOW〉かせきさいだぁ≡ & スペシャルゲスト!?

※ラッパーとしてデビューし、現在も多彩な活動を繰り広げるかせきさいだぁ≡の個展が、9月16日(水)〜30日(水)の期間中DOARAT原宿店で満を持して開催!
過去に氏とコラボし、大ヒットしたサングラスの興奮を再びとコラボグッズを前回にも増して多数販売!
是非観て、鼻水垂らして下さい。

そして…9月21日(月)は豪華ゲスト出演!
HUGTON in DOARATフェスも開催!!
店舗では買えないフェス会場限定コラボグッズも販売!

——————————————————————————————————————————–

新宿タワレコのインストアで偶然Baby & CIDER観て以来だからかなり久しぶり。DOARATで個展もやってるそうなんでこちらも覗きに行こう。
21日はその後映画秘宝ナイト!町山さんがラジオでおすすめしてた『ザ・ハングオーバー』を観に行くよ!!

かせきさいだぁ
かせきさいだぁ

posted with amazlet at 09.09.19
かせきさいだぁ≡
おもちゃ工房 (2008-08-20)
売り上げランキング: 99489
sky-nuts
SKY NUTS

posted with amazlet at 09.09.19
かせきさいだぁ
トイズファクトリー (1998-08-21)
売り上げランキング: 174484

明日はメタモ!

のはずだったんだけど、どうにも体調が悪くて行かない事に…やはりというか直前になって俺も俺もと行く友人も増えてくるよねー今年のメタモはiPhoneアプリもあって初参加の俺でもキザなあいつに差を付けてカワイ子ちゃんと乾杯☆となるに決まっていたのでしたが、神ちゃんが今年はおとなしくしてなさいって言ってるんでしょう。アプリタイムテーブル表示できんし。明日はゆるりと休む事にします。そんかし!日曜はスチャダラとshing02を観に行くのでここまでには復活しとかなければ。今liquidのサイト見たらサイプレス上野とロベルト吉野も出るんだねーわくわく。↓見てテンション上げつつ寝る。ブー。