Показать случайные слова из списка 50 и увеличить появление 1 слова после определенного времени - PullRequest
0 голосов
/ 22 июня 2011

У меня есть NSMutableArray с именем * arrWords, содержащий список из 50 слов. например Бонд / Bind / King / Sing / Ring и т. Д.

Я использую следующую функцию для отображения случайных слов на экране.

-(void)displayRandomWord //This is called from timer so it randomly shows words on screen
{
    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(150,150,200,30)];
    [lbl setText:[arrWords objectAtIndex:round([self randomXValueBetween:0 andValue:49])];
    [self.view addSubView:[lbl]; //this label will be removed after 1 second I have written code for that.
}
- (float)randomXValueBetween:(float)low andValue:(float)high {
    return (((float) arc4random() / 0xFFFFFFFFu) * (high - low)) + low;
}

Это отлично работает. Теперь моя проблема, скажем, через определенное время я хочу увеличить частоту появления конкретного слова.

Я хочу настроить логику, как изначально «Петь» должен появиться 3 раза в первые 10 секунд. Через 10 секунд я хочу, чтобы он появлялся как минимум в 2 раза больше, чем в 3 раза (то есть 5 раз).

Поскольку это случайный выбор слов «Петь» может появляться 3 раза в первые 10 секунд или не появляться.

Я застрял здесь, чтобы настроить логику. Есть предложения?

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Моей первой мыслью было увеличение количества слова «Пой» через определенное время.

Что я имею в виду, это:

Если у меня есть 50 слов.Шанс получить слово «петь» составляет 1/50.Теперь через 10 секунд я вставляю в массив дополнительное слово «sing».Теперь у меня есть 51 слово.Мой шанс получить слово «петь» увеличился до «2/51».

Это самый простой способ, о котором я мог подумать.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ:Я просто подумал, что если вы хотите убедиться, что у вас есть хотя бы какая-то сумма. Вы можете сделать это следующим образом.

Если вы точно знаете, сколько слов вы будете отображать в первые 10 секунд? Пример.равен 1 в секунду. Тогда вы можете сделать это:

Псевдокод

word = get me a random word from array;
displayCount = 0; number of words already displayed;
max = 10; Displaying 10 words per 10 second
targetWord = "Sing"
targetWordCount = 0;  number of words targeted for this time frame;
requiredTargetWordCount = 2; number of times a word should be displayed during the time frame

for(word; displayCount < max; word.next){
   if word = targetWord
       targetWordCount ++
       display word
   else if displayCount < max - requiredTargetWordCount && targetWordCount != requiredTargetWordCount
       display targetWord  
       targetWordCount ++

displayCount ++

}
0 голосов
/ 22 июня 2011

Вы можете добавить слова весов. Объявите еще один NSMutableArray (скажем, arrWordsWeights) того же размера, что и arrWords. Заполните все изначально 1. Затем вы можете увеличить или уменьшить частоту любого слова, просто увеличив или уменьшив его частоту в массиве весов. Чтобы получить случайный индекс, который учитывает вес, вы можете использовать следующий код:

int maxVal = 0;
for (int i in arrWordsWeights)
    maxVal += i;
int r = arc4random() % maxVal + 1;
int index = 0;
while (r > 0 && index < [arrWordsWeights size])
{
    r -= [arrWordsWeights objectAtIndex:index];
    index++;
}
return index - 1;

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

...