如何连续两次获得相同的数组值

时间:2012-12-06 14:03:44

标签: iphone objective-c ios arrays

我有代码,当我按下按钮时,会导致标签发生变化。 我试图编写代码,以便标签连续两次获得相同的值,但它不起作用,因为我有时会连续两次获得相同的值。

什么是正确的解决方案?

这是代码:

- (IBAction)buttonPressed:(id)sender {
    if (sender == self.button) {
        // Change the randomLabel by right answer
        NSString *path = [[NSBundle mainBundle] pathForResource:@"words" ofType:@"plist"];
        words = [[NSMutableArray alloc] initWithContentsOfFile:path];
        NSString *generateRandomLabel = [NSString stringWithFormat:@"%@", [words objectAtIndex:arc4random_uniform([words count] - 1)]];

        if ([randomLabel.text isEqualToString:generateRandomLabel]) {
            while ([randomLabel.text isEqualToString:generateRandomLabel]) {
                generateRandomLabel = [NSString stringWithFormat:@"%@", [words objectAtIndex:arc4random_uniform([words count] - 1)]];
            }
        } else if (![randomLabel.text isEqualToString:generateRandomLabel]) {
            [self.randomLabel setText:generateRandomLabel];
            [randomLabel.text isEqualToString:generateRandomLabel];
        }
    }

2 个答案:

答案 0 :(得分:3)

问题在于随机函数正在生成一个随机值,但没有任何东西阻止它生成n次相同的值。数组或集合无关紧要

你需要一个非重复的随机算法:

1)你应该保持一次加载数组,而不是每次都重新加载

2)然后SHUFFLE数组一次。 (见What's the Best Way to Shuffle an NSMutableArray?

3)然后按下一个按钮,使用数组中的0对象,将其删除并在结尾处读取

模拟代码:假设单词文件> 1,至少有2个不同的单词

- init {
    self = [super init];
    words = [self loadWordsFromFile];
    [words shuffle];
}

- onButtonPress {
    id word = nil;
    do { 
        [words objectAtIndex:0];
        [words removeObjectAtIndex:0];
        [words addObject:word];
    while([word isEqualToString:[words objectAtIndex:0])
    label.text = word;
}

答案 1 :(得分:1)

你可以通过让你的随机数生成器从数组的所有成员中选择除了最后一个,然后将你选择的那个成员与数组中的最后一个项目进行交换,这样做非常简单:

- (IBAction)buttonPressed:(id)sender {
    if (! words) {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"words" ofType:@"plist"];
        words = [[NSMutableArray alloc] initWithContentsOfFile:path];
    }
    NSInteger index = arc4random_uniform(words.count - 2);
    randomLabel.text = words[index];
    [words exchangeObjectAtIndex:index withObjectAtIndex:words.count-1];
}