6

N 個の整数要素 (N>4) の NSMutableArray があります。この配列から 3 つの異なるランダム要素を取得したいと考えています。完全に均一な分布は必要ありません。3 つの異なるランダムな要素だけで問題ありません。何か提案はありますか?ありがとう

4

4 に答える 4

10

を作り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]);
}];
于 2012-09-09T00:52:02.693 に答える
6
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] の間の値になります。

元のデータ配列を変更したくない場合は、配列のコピーを作成できます。

于 2012-09-09T00:49:32.177 に答える
2

コードのさまざまな場所からこれを複数回実行したい場合は、次のことを検討してください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

于 2012-09-09T00:51:37.310 に答える