【问题标题】:Create a non-repeating random number [duplicate]创建一个不重复的随机数[重复]
【发布时间】:2013-10-28 17:58:39
【问题描述】:

我想知道如何做到这一点,这样同一张图片就不会连续选择两次。可以说图片的编号为 1-3。如果选择了图片 1,那么接下来不会选择图片 1。如果选择了图片3,则可以再次选择图片1,以此类推。

我知道我必须使用while 语句,但我不知道如何使用。以下是我现在所拥有的:

- (void)chooseBackgroundImage{
  if(thisNumber % 10 == 0){
    int chooseBackgroundImage = arc4random() % 7;
    switch (chooseBackgroundImage) {
        case 0:
            backgroundImage.image = [UIImage imageNamed:@"CyanToYellowBackground.png"];
            break;
        case 1:
            backgroundImage.image = [UIImage imageNamed:@"GreenToBlueBackground.png"];
            break;
        case 2:
            backgroundImage.image = [UIImage imageNamed:@"OrangeToGreenBackground.png"];
            break;
        case 3:
            backgroundImage.image = [UIImage imageNamed:@"OrangeToPurpleBackground.png"];
            break;
        case 4:
            backgroundImage.image = [UIImage imageNamed:@"PurpleToCyanBackground.png"];
            break;
        case 5:
            backgroundImage.image = [UIImage imageNamed:@"RedToBlueBackground.png"];
            break;
        case 6:
            backgroundImage.image = [UIImage imageNamed:@"YellowToRedBackground.png"];
            break;
       }
    }
}

我也尝试过使用:

- (void)chooseBackgroundImage{
if(slogansGenerated % 10 == 0){
    int chooseBackgroundImage = arc4random() % 7;
    while(chooseBackgroundImage == oldChooseBackgroundImage){
    switch (chooseBackgroundImage) {
        case 0:
            backgroundImage.image = [UIImage imageNamed:@"CyanToYellowBackground.png"];
            break;
        case 1:
            backgroundImage.image = [UIImage imageNamed:@"GreenToBlueBackground.png"];
            break;
        case 2:
            backgroundImage.image = [UIImage imageNamed:@"OrangeToGreenBackground.png"];
            break;
        case 3:
            backgroundImage.image = [UIImage imageNamed:@"OrangeToPurpleBackground.png"];
            break;
        case 4:
            backgroundImage.image = [UIImage imageNamed:@"PurpleToCyanBackground.png"];
            break;
        case 5:
            backgroundImage.image = [UIImage imageNamed:@"RedToBlueBackground.png"];
            break;
        case 6:
            backgroundImage.image = [UIImage imageNamed:@"YellowToRedBackground.png"];
            break;
    }
    int oldChooseBackgroundImage = chooseBackroundImage
  }
}

但似乎没有任何效果。有没有办法创建一个不重复的随机数?

【问题讨论】:

  • 我想我知道你想要什么,添加一个iVar,即currentSelection,然后使用if语句,检查当前图片是新选择的图片

标签: ios xcode while-loop


【解决方案1】:

以下内容可能足以满足您的需要:

首先添加一个实例变量,比如lastChosenBackgroundImage

之后:

int chooseBackgroundImage = arc4random() % 7;

添加:

if(chooseBackgroundImage == lastChosenBackgroundImage)
   chooseBackgroundImage = (chooseBackgroundImage + 1) % 7; // same as last time, move to next choice
lastChosenBackgroundImage = chooseBackgroundImage; // remember for next time

这确实意味着选择下一张图片的可能性是选择其他任何一张的可能性的两倍,但我怀疑这对您的用例来说不会是一个重大问题。

【讨论】:

    【解决方案2】:

    我发现你正在寻找这样的东西。

    -(int)getNonRepeatedRandom{
        int randomNumber = -1;
        do{
            randomNumber = arc4random_uniform(7);
        } while (randomNumber == oldRandomNumber);
        oldRandomNumber = randomNumber; //set the random number to old random so you can check it on the next run.
        return randomNumber;
    }
    

    oldRandomNumber 必须是 iVar 才能使其工作。

    您应该使用 arc4random_uniform 而不是 arc4random 模数来消除模数偏差。

    【讨论】:

    • 这就是我一直在尝试做的......在 while 语句中使用 != 会产生一个持续的 do-while 循环,而使用 == 永远不会改变数字跨度>
    • 糟糕,我犯了一个逻辑错误。这段代码确实可以正常工作。它比接受的答案稍微随机。
    • 我现在确实使用 arc4random_uniform。即使我不完全理解为什么它会更随机,或者比 arc4random() 更好。不过谢谢! +1
    • 在这里查看模偏差stackoverflow.com/questions/10984974/… 也统一更容易使用。
    【解决方案3】:

    使用此实用函数为您提供范围(在您的情况下为 0 和 6)之间的随机整数 -

    #define MAX_ATTEMPTCOUNT 10
    // Provides a random number between the range (both inclusive).
    + (int)randomIntegerInRange:(int)fromInt toInteger:(int)toInt excluding:(NSArray *)excludeNumbers {
        NSAssert((toInt - fromInt) > 0 && (!excludeNumbers ? YES : (toInt - (fromInt - 1)) >= [excludeNumbers count]), @"Invalid range");
        static int randomAttempts = 0;
    
        srandom(time(NULL));
        int randomInteger = fromInt + random() % (toInt - (fromInt - 1));
    
        if (excludeNumbers != nil) {
            for (NSNumber *number in excludeNumbers) {
                if ([number intValue] == randomInteger) {
                    if (randomAttempts == MAX_ATTEMPTCOUNT) {
                        // Reached the maximum attempt count to get the random number but failed to find one.
                        break;
                    }
                    else {
                        // Recursive call to get obtain the next number.
                        ++randomAttempts;
                        randomInteger = [self randomIntegerInRange:fromInt toInteger:toInt excluding:excludeNumbers];
                    }
                    break;
                }
            }
    
            if (randomAttempts >= MAX_ATTEMPTCOUNT) {
                // Pick up the first number that's not there in visited words.
                randomAttempts = 0; // Reset the counter for next attempt.
                randomInteger = fromInt;
    
                for (; randomInteger <= toInt; ++randomInteger) {
                    bool found = NO;
                    for (NSNumber *number in excludeNumbers) {
                        if ([number intValue] == randomInteger) {
                            // Found the number.
                            found = YES;
                            break;
                        }
                    }
                    if (!found) break;
                    else continue;
                }
            }
        }
    
        return randomInteger;
    }
    

    将返回的整数添加到一个数组(排除数字的数组)中,该数组实际上作为参数(excludeNumbers)传递。

    如果有任何问题,请告诉我(我是为我的一个项目制作的,因此可能不完全适合您的需要,因此请随时修改或询问我)

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 2012-01-08
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多