‘乱数’ タグのついている投稿

アルゴリズム:重複しないランダムな数値を配列で取得

2010年11月4日 木曜日

ちょいちょい使うんでメモ。
# 今回はこちらから拝借
http://por.s54.xrea.com/lab/230/

これはActionScript用みたいですが、アルゴリズム的にはなんでも使えるよね。
早いとか遅いとかは分からないですけど…

var rndList:Array = [];
rndList = randomList(10);

// 整数を重複なしにランダム取得
function randomList(max:Number):Array
{
	var inList:Array = [];
	var outList:Array = [];
	var j = 0;
	var rndValue;

	for (var i=0; i<max; i++)
		inList[i] = i;

	var inListL = inList.length;
	while (inListL)
	{
		rndValue = Math.floor( Math.random() * (max-j) );
		outList[j] = inList.splice( rndValue, 1 );
		j++;
		inListL = inList.length;
	}
	return outList;
};

 
 
2010.12.01 追記:
Objective-C の場合。
intのNSArrayが作れなくて焦った。
NSIntegerはオブジェクトじゃないですよ、NSNumberじゃないとダメですよ。

NSMutableArray *rndList	= [[NSMutableArray alloc] initWithArray:[self randomList:10]];

- (NSMutableArray*)randomList:(int)max
{
	NSMutableArray *inList	= [[NSMutableArray alloc] init];
	NSMutableArray *outList	= [[NSMutableArray alloc] init];
	int j = 0;
	int randomNumber = 0;

	for (int i=0; i<max; i++)
	{
		NSNumber *nsNum = [NSNumber numberWithInt:i];
		[inList insertObject:nsNum atIndex:i];
	}

	// 現在の日時を用いて乱数を初期化する
	srand([[NSDate date] timeIntervalSinceReferenceDate]);

	int inListL = [inList count];
	while (inListL)
	{
		randomNumber = rand() % (max-j);

		NSNumber *nm_ = [inList objectAtIndex:randomNumber];
		[outList addObject:nm_];
		[inList removeObjectAtIndex:randomNumber];
		j++;
		inListL = [inList count];
		NSLog(@"%d:%d",inListL,[nm_ intValue]);
	}
	return outList;
}