4

私はiPhoneアプリで、繰り返しのないarc4random_uniformを何年もの間機能させるように努めてきました。運がなく、stackoverflowでこれに関連するすべての質問と回答を確認しました。今、誰かが私を助けてくれることを願っています。私がやりたいのは、1から104までの13の異なる乱数を選択することです。13の異なる数を選択するようになりましたが、2つが同じである場合もあります。

int rand = arc4random_uniform(104);

これが私が行っていることであり、次にrandを使用して配列から選択しています。配列をシャッフルしてから上から13を選択する方が簡単な場合は、それを試してみますが、それは難しいように思われるので、その方法についてサポートが必要になります。

アドバイスありがとうございます。

4

4 に答える 4

14

ar4random_uniform()それが繰り返されないという保証はありません。少し考えてみてください。0から103までの数値を生成するように求めています。これを155回実行すると、以前の選択の1つを繰り返すしかありません。関数は、番号を要求する回数をどのようにして知ることができますか?

すでに取得している番号のリストを確認して、繰り返しの場合は新しい番号を要求するか、配列をシャッフルする必要があります。そのためのSOに関する質問はいくつもあるはずです。これが最も古いものの1つです:NSMutableArrayをシャッフルするための最良の方法は何ですか?

非反復乱数についてもかなりの数の質問があります:https ://stackoverflow.com/search?q =%5Bobjc%5D + non-repeating + random + numbers

于 2012-04-19T17:40:18.820 に答える
2

次のようにを作成しNSMutableSetて実装できます。

NSMutableArray* numbers = [[NSMutableArray alloc] initWithCapacity: 13];
NSMutableSet* usedValues = [[NSMutableSet alloc] initWithCapacity: 13];

for (int i = 0; i < 13; i++) {
  int randomNum = arc4random_uniform(104);
  while ([usedValues containsObject: [NSNumber numberWithInt: randomNum]) {     
    randomNum = arc4random_uniform(104)
  }
  [[usedValues addObject: [NSNumber numberWithInt: randomNum];
  [numbers addObject: [[NSNumber numberWithInt: randomNum];
}
于 2014-07-22T21:21:57.477 に答える
1

または、それぞれが一意の整数である105個の整数の可変配列を作成し、arc4random_uniform([arrayname count])を作成して、同じ配列を配列から削除すると、繰り返さずに毎回ランダムなintを取得できます(ただし、小さい方が配列は、次の数値がどうなるかを予測するのが簡単になります。単純な確率です)

于 2013-05-28T23:59:38.487 に答える
0

この正確な質問に対して私が見つけた最良のアルゴリズムはここに記述されています:

値の単一のランダムな組み合わせを選択するアルゴリズム?

104個の要素の配列をシャッフルする代わりに、13回ループする必要があります。これがObjectiveCでのアルゴリズムの私の実装です:

// Implementation of the Floyd algorithm from Programming Pearls.
// Returns a NSSet of num_values from 0 to max_value - 1.
static NSSet* getUniqueRandomNumbers(int num_values, int max_value) {
    assert(max_value >= num_values);
    NSMutableSet* set = [NSMutableSet setWithCapacity:num_values];
    for (int i = max_value - num_values; i < max_value; ++i) {
        NSNumber* rand = [NSNumber numberWithInt:arc4random_uniform(i)];
        if ([set containsObject:rand]) {
            [set addObject:[NSNumber numberWithInt:i]];
        } else {
            [set addObject:rand];
        }
    }
    return set;
}
于 2013-06-05T09:08:29.903 に答える