メニュー 閉じる

022. Processingで配列のデータをランダムに(ダブり無しで)抽出してみる

配列内のデータをランダムに拾うのは簡単です。配列のインデックス数の乱数で拾えばいいのですが、どこかで同じインデックスを拾う可能性があります。一回拾ったデータを拾う対象から無くす小ネタです。

//ベースの配列
String[] base_arr = {"aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg"};
//シャッフルした配列
String[] rand_arr = new String[base_arr.length];
//いろいろ操作用配列
String[] temp_arr;
//乱数格納用変数
int num = 0;

for (int i = 0; i < rand_arr.length; i++) {

	//要素1個の仮配列を作成
	temp_arr = new String[1];
	//ベース配列のサイズから乱数を作成
	num = int (random (base_arr.length));

	//出来た乱数のインデックスの要素を抜き出して仮配列に入れる
	temp_arr = subset (base_arr, num, 1);
	//シャッフル配列に仮配列0番目を代入
	rand_arr[i] = temp_arr[0];
	//上2行について
	//rand_arr[i] = subset (base_arr, num, 1);
	//としたいところだが、
	//文字 = 配列(エラー)
	//となる(抜き出した要素が1個でもあくまでも配列)ので
	//一旦要素1個の仮配列に入れる

	//次にベース配列より1個少ないサイズの仮配列を作成
	temp_arr = new String[base_arr.length - 1];
	//仮インデックス用の変数
	int count = 0;
	//ベース配列のサイズ分だけループして
	for (int j = 0; j < base_arr.length; j++) {
		//先ほど出た乱数以外の要素をベース配列から抽出
		if (j != num) {
			temp_arr[count] = base_arr[j];
			count += 1;
		}
	}
	//ベース配列と要素が1個抜けた仮配列を入れ替え
	//(ベース配列はサイズが1個減り、抜き出された要素は無くなる)
	base_arr = temp_arr;
}

println (rand_arr);

 

Posted in processing