0

プロンプトが表示されたときに複数の動画を再生する必要があるアプリがありますが、動画をランダムにして繰り返さないようにしたいと思います。

私の現在の計画は、キーがビデオの番号であり、値が再生されたかどうかを示す基本的な文字列であるNSMutableDictionaryを作成することです。次に、ビデオを再生するときに、ランダムに1つを選択して、再生されたかどうかを確認します。そのようです:

int randomNumber;
randomNumber = (arc4random() % 150) + 1;
if ([[videoDictionary valueForKey:[NSString stringWithFormat:@"%d", randomNumber]] isEqual:@"Played"])
{
   // This video has been played before. Make another random number and try again
} else {
   // This video has not been played before. Set the dictionary value to 'Played' and play the video
}

これを行うためのより良い方法はありますか?100を超えるビデオでは、それらの90%がすでに再生されている場合、これは少し厄介になり始める可能性があります。

4

3 に答える 3

4

辞書のコピーを NSMutableDictionary に作成します。

arc4random が選んだ、再生します。

辞書から削除してください。

NSInteger randomNumber=arc4random();
NSMutableDictionary *playingVideo=[NSMutableDictionary dictionaryWithDictionary:videoDictionary];
//select a video from playingVideo
NSString *key= [NSString stringWithFormat:@"%d", randomNumber];
// ....
//remove from there
[playingVideo removeObjectForKey:key]; 

編集1:

これは乱数を生成して辞書で検索しているためです。そこにないか、すでに置き換えられている可能性があり、1000回の反復でも特定の数は生成されません。

したがって、この場合、次のようにすることができます:

NSMutableDictionary *playingVideo=[NSMutableDictionary dictionaryWithDictionary:videoDictionary];
while(playingVideo.count){
    NSMutableArray *keys=[playingVideo allKeys];
    NSInteger randomNumber=arc4random()%keys.count;
    NSString *key=[NSString stringWithFormat:@"%d", keys[key]];
    NSString *videoToPlay=playingVideo[key];
    //play it
    [playingVideo removeObjectForKey:key];
} 
于 2013-03-18T12:18:25.037 に答える
3
  • すべての数値を含む可変配列を作成します。
  • 要素をシャッフルします ( NSMutableArray をシャッフルする最良の方法は何ですか? )
  • 配列の最初の要素を取得し、ビデオを再生します
  • 配列の最初の要素を削除します
  • 配列が空の場合は、再作成して再度シャッフルします

このアプローチでは、90% で同じ「ダフさ」を得ることはできません。

于 2013-03-18T12:23:34.637 に答える
1

乱数を使用する場合は、下限から上限までの乱数を使用するようにしてください。

(arc4random() % 10) + 1; // it will produce random number from 1 to 10
于 2013-03-18T12:27:42.403 に答える