配列から重複せずに値を取り出す
最近クイズを作る機会が何度かありまして、総数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に修正。
