2012-11-19 89 views
0

我想要爲賓果應用程序生成一個唯一的數字,現在它的選擇在90之間的90個隨機數字,並將它們添加到NSMutableSet。這一切都有效,但我從集合中挑選出的號碼是唯一的,所以相同的號碼被拉出兩次。生成一個唯一的數字

這是我到目前爲止有:

NSMutableSet * numberSet1 = [NSMutableSet setWithCapacity:90]; 
while ([numberSet1 count] < 90) { 
    NSNumber * randomNumber1 = [NSNumber numberWithInt:(arc4random() % 90 + 1)]; 
    [numberSet1 addObject:randomNumber1]; 
} 
//NSLog(@"numberWithSet : %@ \n\n",numberSet1); 

NSArray * numbers = [numberSet1 allObjects]; 
//to display 
int r = arc4random() % [numbers count]; 
if(r<[numbers count]){ 
    numberLabel.text = [NSString stringWithFormat:@"%@", [numbers objectAtIndex:r]]; 
} 

如何從給我重複制止呢?提前

+0

有什麼問題嗎? –

+0

該代碼似乎以隨機順序創建一個數字1-90,沒有重複。你想要做什麼,它究竟在做什麼? – rmaddy

+0

@rmaddy當我嘗試在標籤中顯示數字時,它給了我重複的數字,我使用以下命令來顯示int r = arc4random()%[numbers count]; if(r <[numbers count]){numberLabel.text = [NSString stringWithFormat:@「%@」,[numbers objectAtIndex:r]]; } –

回答

1

由於作爲替代選擇的隨機數arc4random()(其中samples with replacement,你可能不希望的賓果遊戲):

  1. 通過90
  2. 以數字1的陣列
  3. Shuffle那個數組。
  4. 從數組中選擇第一個數字,然後選擇第二個數字,依此類推。

保留數組中當前選定元素的索引。要獲得下一個數字,請增加並檢查是否取消引用第90個元素。

一些僞代碼:

#define SIZE 90 

unsigned int index; 
unsigned int elements[SIZE]; 

/* step 1 -- populate the array with elements 1 through 90 */ 
for (index = 0; index < SIZE; index++) 
    elements[index] = index + 1; 

/* step 2 -- shuffle the array */ 
fisher_yates_shuffle(elements); 

/* step 3 -- read from the array */ 
for (index = 0; index < SIZE; index++) 
    fprintf(stdout, "element at index %u is %u\n", index, elements[index]); 
+0

謝謝亞歷克斯,我有點小菜可以給我一個頭開始第三點請嗎? –

+0

是否有一個downvote的原因? –

0

這產生並混洗的陣列。

// array to shuffle 
NSMutableArray *array = [NSMutableArray array]; 
for(int i=1; i<91; i++){ 
    [array addObject:[NSNumber numberWithInt:i]]; 
} 

// shuffle 
for (int i = [array count]-1; i>0; i--) { 
    [array exchangeObjectAtIndex:i withObjectAtIndex:arc4random()%(i+1)]; 
} 

不知道這是否是你,因爲隨機1-90採摘90號沒有重複,並把它們添加到一個可變集想要的東西是沒有從加入一切一個可變集不同。但是如果你想要90個數字的一​​個子集只需要從數組中取n個元素。

0

從抽獎程序,我寫了一段時間後,也適用這裏 -

int ball[6], counter, check, similarity; 
for (counter = 1; counter <= 6; counter++) 
{ 
    for (;;) 
    { 
     similarity = 0; 
     ball[counter] = 1 + arc4random() % 6; 
     for (check = counter-1; check >= 1;check--) 
     { 
      if (ball[check] == ball[counter]) 
      { 
       similarity = 1; 
       break; 
      } 
     } 
    if(similarity == 0) 
     break; 
    } 
printf("%i\n", ball[counter]); 
} 

檢查與所有以前的球選擇球,將永遠不會得到相同數量的兩倍。

0

創建上的NSMutableArray

類別
@implementation NSMutableArray (RandomUtils) 
-(void)shuffle 
{ 
    NSUInteger count = [self count]; 
    for (NSUInteger i = 0; i < count; ++i) { 
     NSUInteger nElements = count - i; 
     NSUInteger n = (arc4random() % nElements) + i; 
     [self exchangeObjectAtIndex:i withObjectAtIndex:n]; 
    } 
} 

@end 

你也可以把它包起來一個NSArray的版本

@implementation NSArray (RandomUtils) 

-(NSMutableArray *)mutableArrayShuffled 
{ 
    NSMutableArray *array = [[self mutableCopy] autorelease]; 
    [array shuffle]; 
    return array; 
} 

-(NSArray *)arrayShuffled 
{ 
    return [NSArray arrayWithArray:[self mutableArrayShuffled]]; 
} 

@end 

在必要情況下,進口類,這樣做:

NSMutableArray *array = [NSMutableArray array]; 
for(int i=0; i<90; i++){ 
    [array addObject:[NSNumber numberWithInt:i+1]]; 
} 
[array shuffle]; 
NSArray *newarray = [array subarrayWithRange:NSMakeRange(0,6)]; 

另一種方法co可以用6個隨機選擇來填充一組。

在類別

@implementation NSArray (RandomUtils) 
-(id)randomElement 
{ 
    if ([self count] < 1) return nil; 
    NSUInteger randomIndex = arc4random() % [self count]; 
    return [self objectAtIndex:randomIndex]; 
} 
@end 

這樣使用它:

NSMutableSet *mset = [NSMutableSet set]; 

while ([mset count]<6) { 
    [mset addObject:[array randomElement]]; 
}