N 個の整数要素 (N>4) の NSMutableArray があります。この配列から 3 つの異なるランダム要素を取得したいと考えています。完全に均一な分布は必要ありません。3 つの異なるランダムな要素だけで問題ありません。何か提案はありますか?ありがとう
4 に答える
を作りNSIndexSet
、追加し続ける
int value = arc4random() % array.count;
サイズが になるまでアイテムを追加し3
ます。3 つのインデックスがあることがわかります。
NSMutableIndexSet *picks = [NSMutableIndexSet indexSet];
do {
[picks addIndex:arc4random() % array.count];
} while (picks.count != 3);
[picks enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
NSLog(@"Element at index %ud: %@", idx, [array elementAt:idx]);
}];
for (int i = 1; i <= 3; i++) {
int index = (int)(arc4random() % [array count]);
id object = [array objectAtIndex:index];
[array removeObjectAtIndex:index];
}
arc4random()
[0,2^32-1) の範囲の乱数を返します。配列のサイズでモジュラスをとったときの余りは、[0,arrayCountLessOne] の間の値になります。
元のデータ配列を変更したくない場合は、配列のコピーを作成できます。
コードのさまざまな場所からこれを複数回実行したい場合は、次のことを検討してくださいrandomObjects
。メソッド自体は、0 から配列の長さ -1 ( N-1
) までの 3 つのランダムな整数を生成し、次に、他の回答 (特に dasblinkenlight のもの) に従って、それらのインデックスで配列からオブジェクトのセットを返す必要があります。
まず、カテゴリを作成します。NSMutableArray+RandomObject.h
以下を含む新しいヘッダー ファイルを作成します。
@interface NSMutableArray (RandomObjects)
- (NSSet *) randomObjects;
@end
RandomElement
括弧内はあなたのカテゴリーの名前です。この新しいヘッダー ファイルを含むクラスを記述すると、すべてのNSMutableArray
インスタンスにrandomElement
メソッドが与えられます。
次に、実装は次のNSMutableArray+RandomObjects.m
とおりです。
@implementation NSMutableArray (RandomObjects)
- (NSSet *) randomObjects {
// Use the code from @dasblinkenlight's answer here, adding the following line:
return picks;
}
@end
そして、それは基本的にそれです。その機能を に効果的に追加しましたNSMutableArray
。