2010-08-05 5 views
1

Chaque maintenant et encore, ce qui suit est comme -1Pourquoi ce nombre aléatoire est-il parfois défini sur -1?

int randomIndex = random() % [directionsArray count] - 1; 

La méthode init pour cette classe est là directionsArray est créé et srand() est appelé. On dirait que cette

- (id) initSprite 
{ 
    if ((self = [super initSprite])) { 

     speed = 1; 

     directionsArray = [[NSArray arrayWithObjects:STRING_CONSTANT, STRING_CONSTANT, nil] retain]; 
     srand(time(NULL)); 
     [self pickRandomDirection]; 


    } 
    return self; 
} 

- (void) pickRandomDirection 
{ 
    int randomIndex = random() % [directionsArray count] - 1; // This sometimes comes out as -1?? 
} 

En ce moment, je travaille autour de lui en utilisant abs(randomIndex), mais c'est tricher et je devrais probablement savoir ce qui se passe pour référence future.

Répondre

6

Parce que 0 - 1 est égal à -1.

random() % [directionsArray count] - 1; 

Que faire si random() renvoie 0 ici? Vous obtenez 0% [nombre de directionsArray] - 1; qui est -1, puisque% a priorité sur -

Peut-être que vous voulez random() % ([directionsArray count] - 1);

+0

Toutes les bonnes réponses, mais c'est celui qui m'a fait aller "oh bien ... bien sûr, il le fait ..." – gargantuan

+1

Vous devriez probablement accepter la réponse alors :) –

+0

a dû attendre 8 minutes. – gargantuan

1

Ne pas utiliser random

Utilisez arc4random à la place.

Maintenant ce problème est résolu, vous soustraire 1 de l'expression de la randomisation, qui, dans le cas de retour arc4random % len0, vous seriez soustrayez 1 de ce qui est -1.

+0

Dans certains cas, utiliser 'arc4random' au lieu de' random 'est une bonne idée. Dans d'autres, cela n'a aucun sens. Choisir une direction "aléatoire" pour un sprite tombera généralement dans cette dernière catégorie. Cependant, l'OP devrait utiliser 'srandom' plutôt que' srand' s'il reste avec 'random'. –

1

Je recommanderais arc4random. Il semble être le plus facile à utiliser et le meilleur disponible dans le SDK.

arc4random() % [directionsArray count]; 
5

Est-ce que% a la priorité sur -1? Si c'est le cas, alors quand le reste est 0, il en résultera 1 négatif.

2

Apprenez à connaître votre operator precedence. En cas de doute, utilisez des parenthèses:

int randomIndex = random() % ([directionsArray count] - 1); 
2

Je ne sais pas pourquoi personne d'autre a mentionné, mais la solution (dans votre cas) est en fait de ne pas soustraire du tout.

Comme vous le savez probablement, les index sont basés sur zéro. Les restes commencent également à 0, et ils vont jusqu'au diviseur moins un, puis en boucle. Considérons, par exemple, le cas de count == 3:

  • 0% 3 = 0
  • 1% 3 = 1
  • 2% 3 = 2
  • 3% 3 = 0

Faire la division en premier, comme Stephen Canon et Jonathan Fischoff vous l'ont déjà dit, vous amènera à soustraire 1 de ces index valides, provoquant le problème que vous avez vu.

Faire la deuxième division n'est pas beaucoup mieux: Il résout le problème de venir avec un indice de -1, mais vous êtes toujours couper le dernier indice possible:

  • 0% (compte - 1 = 2) = 0
  • 1% 2 = 1
  • 2% 2 = 0
  • 3% 2 = 1

Remarquez comment l'index 3 est jamais.

Diviser uniquement; découper la soustraction.

En outre, les index sont normalement NSUInteger (type entier non signé , contrairement int, qui est signé) à Cocoa et Cocoa Touch.

+0

Cette réponse devrait être plus élevée, car elle code réellement ce que le demandeur voulait. – BarrettJ

Questions connexes