2012-04-19 3 views
4

私は今iPhoneアプリのために年齢のために非反復arc4random_uniformを働かせようとしています。 stackoverflowでこれに関連するすべての質問と回答を運行なしで、今私は誰かが私を助けることを望んでいる。私がしたいのは、1と104の間の13の異なる乱数を選ぶことです。13の異なる数字を選んだ時点で動作するようになっていますが、2つが同じであることもあります。ノンリピートarc4random_uniform

int rand = arc4random_uniform(104); 

これは私がやっていることです、そして、私は配列から選択するためにランドを使用しています。配列をシャッフルしてから上から13を選ぶ方が簡単なら、それを試してみるでしょうが、それはもっと難しいと思われるので、どのように助けが必要でしょう。

ありがとうございました。

+0

あなたは、配列をシャッフルまたは1つからランダムにアイテムを選択したい場合は、I 「objective-c array shuffle」または「randomized queue」を検索することをお勧めします。 – Timo

答えて

12

ar4random_uniform()は何も保証されません。あなたはそれを100回から5回行うと、それ以前の選択肢の1つを繰り返すしかありません。どのようにして関数が何回番号を要求するかを知ることができますか?

あなたがすでに持っている番号のリストをチェックし、それがリピートの場合は新しい番号を要求するか、配列をシャッフルする必要があります。それのためには、それについていくつかの質問があるはずです。最も古いものの1つはWhat's the Best Way to Shuffle an NSMutableArray?です。

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

+0

さて、それは基本的に私が探していたものでした。もう一度同じ質問をして申し訳ありませんが、私は見た他の回答とうまく動作しないようです。 –

+2

+1それをもっと強く再現するには: 'arc4random_uniform()'が繰り返されなかった場合、それはランダムではありません。適度に狭い範囲では、リピートだけでなくリピートのシーケンスも期待する必要があります。非常に小さい範囲(コインフリップのようなもの)では、かなり長いシーケンスの繰り返しが必要です。表示されない場合は、乱数ジェネレータに問題がある可能性があります。ジョシュが言うように、あなたが本当に望むのはシャッフルです。 –

+0

[set count] == 13になるまでセットに入れます。 – RegularExpression

1

はまたあなたも105個の整数、それぞれユニークな、とarc4random_uniform([arrayname数])の可変配列を作成していることを削除することができます配列から同じものを返すと、繰り返しなくてもランダムなintが返されます(ただし配列が小さくなるほど次の数字がどれくらい単純かを予測するのが簡単になります)

0

私はこの正確な質問がここに記載されていることを発見しました:

Algorithm to select a single, random combination of values?

104要素の配列をシャッフルする代わりに、13回ループするだけで済みます。

// 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; 
} 
2

あなたはNSMutableSetを作成し、このようにそれを実装することができます:ここでの目的Cにおけるアルゴリズムの私の実装です

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]; 
} 
関連する問題