2011-10-29 14 views
2

私はインデックス0-9の10個のオブジェクトを含むNSArrayを持っています。配列の各エントリは引用です。NSArrayからランダムオブジェクトを選択してください。

私のユーザーが「ランダムな引用符」オプションを選択すると、配列からランダムなエントリを選択し、そのエントリに含まれているテキストを表示できるようにしたいと考えています。

これを達成する方法について誰でも正しい方向に向けることができますか?

+0

[NSArrayの中にランダムなオブジェクトを選ぶ]の可能な複製(http://stackoverflow.com/questions/3318902/picking-a-random-object-in-an-nsarray) –

答えて

6

10をハードコードする代わりにこれを使用することをお勧めします。そうすれば、引用を追加すると、その番号を変更することなく、自動的に引用が追加されます。

NSInteger randomIndex = arc4random()%[array count]; 
NSString *quote = [array objectAtIndex:randomIndex]; 
+0

パーフェクト、それは配列を数えるのが良い考えです。ありがとうございました。 –

+0

それは素晴らしいです!おかげでたくさん! – Farini

0

まず、範囲内の乱数を取得します。this discussionと関連するマニュアルページを参照してください。次に、配列にインデックスを付けるだけです。

int random_number = rand()%10; // Or whatever other method. 
return [quote_array objectAtIndex:random_number]; 

編集:正しくリンクから補間することができないか、単に提案の参照を読み取るために気にしない人のために、私はあなたのためにこれを綴るてみましょう:

// Somewhere it'll be included when necessary, 
// probably the header for whatever uses it most. 
#ifdef DEBUG 
#define RAND(N) (rand()%N) 
#else 
#define RAND(N) (arc4random()%N) 
#endif 

... 

// Somewhere it'll be called before RAND(), 
// either appDidLaunch:... in your application delegate 
// or the init method of whatever needs it. 
#ifdef DEBUG 
// Use the same seed for debugging 
// or you can get errors you have a hard time reproducing. 
srand(42); 
#else 
// Don't seed arc4random() 
#endif 

.... 

// Wherever you need this. 
NSString *getRandomString(NSArray *array) { 
    #ifdef DEBUG 
    // I highly suggest this, 
    // but if you don't want to put it in you don't have to. 
    assert(array != nil); 
    #endif 
    int index = RAND([array count]); 
    return [array objectAtIndex:index]; 
} 
+0

は、それがベストですarc4random()を使用してください。シードが提供されていない場合、アプリケーションの実行ごとにSAMシーケンスが返されます。 – zaph

+0

@CocoaFuまず、ディスカッションをリンクしてマニュアルページを参照し、コードサンプルの可変ランダムメソッドを指摘しました。次に、毎回異なるシードのプログラムをデバッグしようとしたことがありますか? – Kevin

+0

この部分がかなり徹底的にデバッグされて動作するまで、はい。 1つのストリームで作業している場合は、他のストリームを試してみることができます。それにかかわらず、幸運を拾うには暗号レベルのランダム性は必要ありません。顧客は100万件の選択肢を記録するつもりはなく、1/1,000,000の偏りについて不平を言う。 – Kevin

1

あなたおそらくarc4random()を使って0-9からオブジェクトを選びたいと思うでしょう。その後、単純に行う

NSString* string = [array objectAtIndex:randomPicked]; 

エントリのテキストを取得します。

+0

パーフェクト。私はarc4random()を使って乱数を得ることができましたが、テキストの抽出に問題がありました。ありがとうございました。 –

1

arc4random()%10を使用してインデックスを取得できます。問題ではないはずのわずかな偏りがあります。

arc4random_uniform(10)を使用するとバイアスがなく、さらに使いやすくなります。

+0

ねえ、私はあなたにセキュリティの背景があると思った! 'arc4random_uniform'は偏りがなく、ここで使うべきです。 –

+0

右の 'arc4random_uniform()'は正しい関数です。私はわずかなバイアスを言及したが、mod 10のバイアスは非常に小さい。私は訂正補遺を追加しました。 – zaph

関連する問題