2009-09-19 7 views
6

J'utilise la fonction random()% x pour la génération d'un nombre aléatoire, mais chaque fois que je démarre l'application je vois qu'elle crée ou génère le même nombre .iPhone: random() fonction me donne le même nombre aléatoire à chaque fois

Comme je place des images au hasard sur la base de ce nombre aléatoire et je vois toutes les images sont placées au même endroit, peu importe combien de fois je cours l'application.

+1

Cela semble être un double de cette question: http://stackoverflow.com/questions/1436217/generating-random-values-in-iphone –

Répondre

16

Vous aurez probablement plus de chance avec arc4random(), vous n'avez pas besoin de le semer explicitement et il semble être un "meilleur" aléatoire.

2

N'oubliez pas que vous devez ensemencer le générateur de nombres aléatoires via srandom avant de l'utiliser, avec une valeur changeante telle que l'heure actuelle.

14

Dans votre délégué de l'application:

- (void) applicationDidFinishLaunching:(UIApplication *)application 
{ 
    srandom(time(NULL)); 

    // ... 

    for (int i = 0; i < 100; i++) { 
     NSLog(@"%d", random()); 
    } 
} 

La raison pour laquelle cela fonctionne est parce que les générateurs de nombres pseudo-aléatoires ont besoin d'un départ ou graines de valeur. En utilisant l'heure, vous êtes plus susceptible d'obtenir différentes séquences de nombres "aléatoires" à chaque exécution.

Si vous ne spécifiez pas de valeur de départ, la même graine est utilisée à chaque exécution, ce qui donne la même séquence. Ce comportement est généralement indésirable, mais dans certains cas, il est utile de pouvoir générer la même séquence, par exemple, pour tester des algorithmes.

Dans la plupart des cas, vous souhaiterez spécifier une valeur de départ qui sera modifiée entre les exécutions, ce qui correspond à l'heure actuelle.

+0

Je recommande l'affiche fait des lectures sur des nombres pseudo-aléatoires (http://en.wikipedia.org/wiki/Pseudorandom_number_generator) pour avoir une bonne compréhension de la raison pour laquelle le code original s'est comporté de cette façon. –

+0

'srandomdev()'. –

2

Appelez d'abord srandomdev().

srandomdev();
long mon_rand = aléatoire();

4

Pour les débutants qui viennent sur ce poste:

La fonction random() produit un pseudo-random sequence. random() façons vous donne la même séquence pseudo-aléatoire chaque fois que vous l'utilisez. Vous devez "ensemencer" la séquence pour choisir un point de départ différent de sorte que chaque fois que vous l'exécutez, il semble différent. Vous pouvez utiliser l'heure système pour semer (srandom(time(NULL)) ou utiliser la fonction d'assistance srandomdev().

Expérimenter essayer:

#include "stdio.h" 

int main(void) { 
    int i; 
    for (i = 0; i < 10; i++) 
     printf("%d\n", random()); 

    return 0; 
} 

Vous aurez toujours la même séquence, sur mon ordinateur, il donne:

1804289383 
846930886 
1681692777 
1714636915 
1957747793 
424238335 
719885386 
1649760492 
596516649 
1189641421 

More reading:

  • La page de manuel au hasard pour plus d'informations. (Run man random du terminal.)
0

Utilisez-srandom (ou l'équivalent pour votre fonction de nombre aléatoire de choix), mais aussi utiliser conditionals autour de lui, de sorte que si vous le débogage, les choses se passent toujours de la même façon. J'ai aussi tendance à mettre des avertissements NSLog en faisant des choses comme ça, donc je ne livre pas de code brian-mort.

#if DEBUG==0 
srandom(time(NULL)); 
#else 
NSLog(@"Debug build: Random numbers are not random!"); 
#endif 

ou

if(!debuggingBuild) 
    srandom(time(NULL)); 
else 
    NSLog(@"Debug build: Random numbers are not random!"); 
4

arc4random sera meilleure solution que rand() ou aléatoire(). Voir this.

+0

Merci pour ce lien - fonction plutôt cool. – Micko

Questions connexes