Случайный генератор чуть менее случайный - PullRequest
0 голосов
/ 28 сентября 2018
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"category == %@", selectedCategory];
NSArray *filteredArray = [self.Quotes filteredArrayUsingPredicate:predicate];
// Get total number in filtered array
int array_tot = (int)[filteredArray count];
// As a safeguard only get quote when the array has rows in it
if (array_tot > 0) {
    // Get random index
    int index = (arc4random() % array_tot);
    // Get the quote string for the index
    NSString *quote = [[filteredArray objectAtIndex:index] valueForKey:@"quote"];
    // Display quote
    self.quote_text.text = quote;
    // Update row to indicate that it has been displayed
    int quote_array_tot = (int)[self.Quotes count];
    NSString *quote1 = [[filteredArray objectAtIndex:index] valueForKey:@"quote"];
    for (int x=0; x < quote_array_tot; x++) {
        NSString *quote2 = [[Quotes objectAtIndex:x] valueForKey:@"quote"];
        if ([quote1 isEqualToString:quote2]) {
            NSMutableDictionary *itemAtIndex = (NSMutableDictionary *)[Quotes objectAtIndex:x];
            [itemAtIndex setValue:@"DONE" forKey:@"source"];
        }
    }

Выше приведен код, который я использую в своем приложении для генерации случайной кавычки из одной из двух категорий, хранящихся в plist (в массивах, где первая строка - это категория, а вторая - это цитата).Однако, кажется, есть предпочтение повторять те, которые уже показаны.Я бы предпочел, чтобы у него были предпочтения (но не только) показывать те, которые не показывал ранее.

1 Ответ

0 голосов
/ 29 сентября 2018

Ваш вопрос является алгоритмом вопроса.Вам нужна последовательность чисел, которая кажется случайной, но более однородной.

То, что вы ищете, называется последовательность с малым расхождением .Простая форма этого - «случайная сумка», часто используемая в разработке игр, как описано здесь или здесь .

С сумкой случайного воспроизведения вы в основном генерируетевсе индексы (например, 0 1 2 3 4 5), перетасуйте их (например, 2 3 5 1 0 4) и затем отобразите элементы в следующем порядке.В конце вы создаете другую последовательность (например, 4 1 0 2 3 5).Обратите внимание, что возможно, что один и тот же элемент появляется дважды в последовательности, хотя это происходит редко.Например, в этом случае «4» является дубликатом, потому что полная последовательность 2 3 5 1 0 4 4 1 0 2 3 5.

arc4random() - это хороший PRNGна платформах Apple, так что это не дает «последовательность с низким расхождением».Но: вы можете использовать его как примитив для генерации «последовательностей с низким расхождением», вы также можете использовать его как примитив для создания реализации shuffle bag.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...