0

我有一个应用程序需要在出现提示时播放多个视频,但我希望视频是随机的而不是重复的。

我目前的计划是制作一个 NSMutableDictionary,其中键是视频的编号,值只是一个基本字符串,告诉我它是否已播放。然后,当要播放视频时,我会随机选择一个,看看它是否已经播放。像这样:

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

使用这种方法,您将不会获得 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 回答