2013-03-02 71 views
2

我在歷史記錄板中創建了10個UIButton,好嗎?
我想添加不重複這些數字的隨機數字,即每當查看被加載時散佈的從0到9的數字。帶有隨機文本/值或標籤的UIButton

我試圖在Google上找到一種方法來使用我現有的按鈕(10個UIButton),並將它們應用於隨機值。找到大多數方法(arc4random() % 10),重複這些數字。

所有的結果發現,創建按鈕的動態。任何人都通過這個?

+1

呃?您的問題目前沒有意義,我擔心 - 我認爲翻譯中可能丟失了某些東西? – sjwarner 2013-03-02 18:43:03

+0

好吧,我會編輯。 – 2013-03-02 18:48:51

+0

@sjwarner編輯。 – 2013-03-02 18:55:01

回答

2

創建一個數組的數組。然後執行一組隨機交換數組中的元素。你現在有隨機順序的唯一號碼。

- (NSArray *)generateRandomNumbers:(NSUInteger)count { 
    NSMutableArray *res = [NSMutableArray arrayWithCapacity:count]; 
    // Populate with the numbers 1 .. count (never use a tag of 0) 
    for (NSUInteger i = 1; i <= count; i++) { 
     [res addObject:@(i)]; 
    } 

    // Shuffle the values - the greater the number of shuffles, the more randomized 
    for (NSUInteger i = 0; i < count * 20; i++) { 
     NSUInteger x = arc4random_uniform(count); 
     NSUInteger y = arc4random_uniform(count); 
     [res exchangeObjectAtIndex:x withObjectAtIndex:y]; 
    } 

    return res; 
} 

// Apply the tags to the buttons. This assumes you have 10 separate ivars for the 10 buttons 
NSArray *randomNumbers = [self generateRandomNumbers:10]; 
button1.tag = [randomNumbers[0] integerValue]; 
button2.tag = [randomNumbers[1] integerValue]; 
... 
button10.tag = [randomNumbers[9] integerValue]; 
+0

偉大的解決方案!我想動態地獲取TAG。但我比插入數組中的按鈕更好。再次感謝 – 2013-03-02 23:15:26

1

@meth有正確的想法。如果你想確保數字不重複,請嘗試如下所示:(注意:頂部會生成最高數字,確保這=數量,否則這將永遠循環並永遠;)

- (NSArray*) makeNumbers: (NSInteger) amount withTopBound: (int) top 
{ 
    NSMutableArray* temp = [[NSMutableArray alloc] initWithCapacity: amount]; 

    for (int i = 0; i < amount; i++) 
    { 
     // make random number 
     NSNumber* randomNum; 

     // flag to check duplicates 
     BOOL duplicate; 

     // check if randomNum is already in your array 
     do 
     { 
      duplicate = NO; 
      randomNum = [NSNumber numberWithInt: arc4random() % top]; 

      for (NSNumber* currentNum in temp) 
      { 
       if ([randomNum isEqualToNumber: currentNum]) 
       { 
        // now we'll try to make a new number on the next pass 
        duplicate = YES; 
       } 
      } 
     } while (duplicate) 

     [temp addObject: randomNum]; 
    } 

    return temp; 
} 
+0

我使用@maddy指出的隨機代,但它不是正確的做法,但是,部分是......但謝謝! – 2013-03-02 23:11:24