2013-10-20 37 views
0

我想知道如何使它不會連續兩次被選中。可以說圖片給出了一個數字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 
    } 
} 

但似乎沒有任何工作。有什麼辦法可以創建一個非重複的隨機數字嗎?

+0

我想我知道你想要什麼,添加一個iVar,即currentSelection,然後使用if語句,檢查當前圖片是新選中的圖片 – DogCoffee

回答

2

以下是可能隨機足夠你需要:

首先添加一個實例變量,比如,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 

這並不意味着挑選下一個圖像的兩倍採摘任何其他的人的作爲可能的,但我懷疑這會不會是一個您的使用案例的重大問題。

0

使用該實用程序的功能給你隨機整數範圍之間(在你的情況下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)。

讓我知道如果任何問題(我做了我的項目之一,所以可能無法完全滿足您的需要可以隨意修改或者問我)

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模數來消除模糊偏差。

+0

這就是我一直試圖做的......使用'! ='在while語句中創建了一個不斷的do-while循環,並且使用== ==從不改變數字 – Jojodmo

+0

糟糕,我犯了一個邏輯錯誤。此代碼確實工作正常。它比公認的答案稍微更隨機。 –

+0

我現在確實在使用arc4random_uniform。儘管我不完全明白爲什麼它會更加隨機,或者比arc4random()更好。雖然謝謝! +1 – Jojodmo