2013-03-18 1 views
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% из них уже сыграны.

+0

Ответ Anoop Vaidya, вероятно, является тем, что вы ищете. У меня лично будет массив видео, перетасуйте его, а затем просто пройдите прямо через массив (перетасовывая снова, когда вы дойдете до конца). Только мои два цента. – jonhopkins

+0

@jonhopkins: Даже ваш ответ хорош :) –

ответ

3
  • Создать изменяемый массив со всеми номерами.
  • Перемешайте элементы (What's the Best Way to Shuffle an NSMutableArray?)
  • Возьмите первый элемент в массиве и воспроизводить видео
  • Удалить первый элемент в массиве
  • Когда массив пуст воссоздать его и перемешайте снова

При таком подходе вы не получите ту же «тупость» на 90%.

+0

Это выглядит как отличный ответ, я попробую это и сегодня вечером Anoop, чтобы увидеть, что хорошо работает для меня лично. –

+0

Я нашел, что это лучшее решение для моих нужд прошлой ночью - легко реализовать и управлять. Спасибо. –

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]; 

EDIT 1:

Поскольку это порождает случайное число и поиск в словаре. Возможно, он не существует или уже заменен, и даже в тысячах итераций определенное число не генерируется.

Так что в этом случае вы можете сделать, как:

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]; 
} 
+0

Спасибо Anoop, но я немного смущен этим. Если случайное число снова генерирует число, которое было ранее воспроизведено, и в нем ничего не найдено в словаре, не было бы ли я в той же ситуации, что и я, с моим собственным решением? –

+0

@AlanTaylor: проверьте, что 'playingVideo [key]' is nil, если да, продолжайте следующую последовательность randomNumber. Или вы можете пойти на ответ Ундефа. –

+0

Спасибо, я отвечу на ваш ответ, когда вернусь домой и посмотрю, будет ли это работать для того, что я ищу. –

1

Когда вы используете случайное число, вы должны убедиться, что используете случайное число от низких до высоких.

(arc4random() % 10) + 1; // it will produce random number from 1 to 10 
+0

Это хороший способ сделать :) –

+0

Спасибо! Я бы это сделал, я отвлекся, набрав свой вопрос, потому что я на работе и не заметил, что я не закончил линию! –