2012-11-19 4 views
0

J'essaie de générer un numéro unique pour une application de bingo, maintenant il choisit 90 numéros aléatoires entre 1-90 et les ajoute à un NSMutableSet. Tout cela fonctionne, mais je fais en sorte que le nombre choisi dans le décor soit unique, donc le même nombre est retiré deux fois.Générer un numéro unique

Voici ce que j'ai jusqu'à présent:

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]]; 
} 

Comment puis-je arrêter de me donner des doublons? Merci à l'avance

+0

Quelle est la question? –

+0

Le code semble créer un tableau avec les numéros 1-90 dans un ordre aléatoire sans doublons. Que voulez-vous faire et que fait-il réellement? – rmaddy

+0

@rmaddy il me donne des numéros en double lorsque j'essaie d'afficher les nombres dans une étiquette, j'utilise ce qui suit pour afficher int r = arc4random()% [nombre compte]; si (r <[nombre compte]) { numberLabel.text = [NSString stringWithFormat: @ "% @", [nombre objetAtIndex: r]]; } –

Répondre

1

Comme alternative à la cueillette des nombres aléatoires avec arc4random() (qui samples with replacement, que vous ne voulez probablement pas pour un jeu de Bingo):

  1. Prenez un tableau de nombres 1 à 90.
  2. Shuffle ce tableau.
  3. Sélectionnez le premier nombre du tableau, puis le second, et ainsi de suite. Conserver un index de l'élément actuellement sélectionné dans le tableau.

Pour obtenir le numéro suivant, incrémentez et vérifiez si vous déréférencer le 90ème élément.

Certains pseudo-code:

#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

Merci Alex, je suis un peu noob pouvez-vous me donner une tête commence au 3e point s'il vous plaît? –

+0

Y a-t-il une raison pour le downvote? –

0

Cela crée et brouille un tableau.

// 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)]; 
} 

Je ne sais pas si cela est ce que vous voulez depuis la cueillette de 90 numéros au hasard 1-90 sans doublons et en les ajoutant à un ensemble mutable est pas différent d'ajouter tout un ensemble mutable. Mais si vous voulez un sous-ensemble des 90 nombres, prenez seulement n éléments du tableau.

0

A partir d'une application de loterie, j'ai écrit un certain temps, également applicable ici-

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]); 
} 

Vérifie la balle choisie avec toutes les balles précédentes, ne sera jamais obtenir le même numéro deux fois.

0

Créer une catégorie sur 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 

Vous pouvez également envelopper une version NSArray

@implementation NSArray (RandomUtils) 

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

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

@end 

Au besoin, importer la catégorie, et à faire:

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)]; 

Une autre approche co Je serais en mesure de remplir un ensemble avec 6 choix aléatoires.

dans la catégorie:

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

utiliser comme:

NSMutableSet *mset = [NSMutableSet set]; 

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