2009-09-19 7 views
6

Sto usando la funzione random()% x per la generazione di un numero casuale, ma ogni volta che avvio l'applicazione vedo che crea o genera lo stesso numero .iPhone: la funzione random() mi dà sempre lo stesso numero casuale

Come se stessi posizionando alcune immagini casualmente in base a quel numero casuale e vedo tutte le immagini sono posizionate nello stesso posto, non importa quante volte eseguo l'applicazione.

+1

Questo sembra essere un duplicato di questa domanda: http://stackoverflow.com/questions/1436217/generating-random-values-in-iphone –

risposta

16

è probabile che sia migliore fortuna con arc4random(), non c'è bisogno di seminare in modo esplicito e sembra essere una "migliore" random.

2

Non dimenticare che è necessario seminare il generatore di numeri casuali tramite srandom prima di utilizzarlo, con un valore variabile come l'ora corrente.

14

Nella vostra delegato applicazione:

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

    // ... 

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

Il motivo per cui funziona è perché numeri pseudo-casuali richiedono una partenza, o seme valore. Usando il tempo, è più probabile che si ottengano sequenze diverse di numeri "casuali" ad ogni esecuzione.

Se non si specifica un valore di seme, lo stesso seme è utilizzato su ogni esecuzione, da cui si ricava la stessa sequenza. Questo è di solito un comportamento indesiderato, ma in alcuni casi è utile essere in grado di generare la stessa sequenza, ad esempio per testare gli algoritmi.

Nella maggior parte dei casi, si vuole specificare un valore seme che cambia tra le esecuzioni, che è dove arriva l'ora attuale in pratico.

+0

Suggerirei il poster fa alcune letture su numeri pseudo casuali (http://en.wikipedia.org/wiki/Pseudorandom_number_generator) per avere una buona comprensione del perché il codice originale si è comportato in quel modo. –

+0

'srandomdev()'. –

2

chiamata srandomdev() prima.

srandomdev();
long my_rand = random();

4

Per i neofiti che imbatto in questo post:

La funzione random() produce un pseudo-random sequence. I modi random() ti danno la stessa sequenza pseudo-casuale ogni volta che la usi. Devi "seminare" la sequenza per scegliere un punto di partenza diverso in modo che ogni volta che lo esegui in modo che appaia diverso. È possibile utilizzare il tempo di sistema per seminare (srandom(time(NULL)) o utilizzare la funzione di supporto srandomdev().

di sperimentare prova:

#include "stdio.h" 

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

    return 0; 
} 

Avrete sempre la stessa sequenza, sul mio computer dà:

1804289383 
846930886 
1681692777 
1714636915 
1957747793 
424238335 
719885386 
1649760492 
596516649 
1189641421 

Più lettura:

  • La pagina man casuale per maggiori informazioni. (Run man random dal Terminal.)
0

utilizzati srandom (o l'equivalente per la funzione numero casuale di scelta), ma anche usare i condizionali intorno ad essa, in modo che se si esegue il debug, le cose accadono sempre allo stesso modo. Tendo anche a mettere gli avvisi NSLog quando faccio cose del genere, quindi non invio codice brian-dead.

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

o

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

arc4random sarà soluzione migliore di rand() o casuale(). Vedi this.

+0

Grazie per questo link - funzione piuttosto interessante. – Micko