2010-08-06 17 views

risposta

67

Come indicato in altri post di seguito, è preferibile utilizzare arc4random_uniform. (Quando questa risposta è stata originariamente scritta, arc4random_uniform non era disponibile). Oltre ad evitare il bias di modulo di arc4random() % x, evita anche un problema di seeding con arc4random quando utilizzato ricorsivamente in tempi brevi.

arc4random_uniform(4) 

genererà 0, 1, 2 o 3. In questo modo è possibile utilizzare:

arc4random_uniform(51) 

e semplicemente aggiungere 50 al risultato di ottenere un range compreso tra 50 & 100 (compreso).

+0

Questo dà solo da 0 a 50, non offre un intervallo compreso tra 50 e 100. – Boon

+2

Come Run Loop, aggiungere 50. int num = (arc4random() % (51)) +50; – Nungster

+7

Attenzione ai [modulo bias] di questo metodo (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias). Più sicuro da usare ['arc4random_uniform()'] (http://stackoverflow.com/questions/648739/objective-c-modulo-bias). – JohnK

18
int fromNumber = 10; 
int toNumber = 30; 
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber; 

Genererà randon number tra 10 e 30, cioè 11,12,13,14......29

+7

È (arc4random()% (toNumber-fromNumber + 1)) + fromNumber – malinois

+4

Attenzione al metodo [modulo bias] (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias). Più sicuro da usare ['arc4random_uniform()'] (http://stackoverflow.com/questions/648739/objective-c-modulo-bias). – JohnK

0

In molte situazioni 10-30 significherebbe inclusiva, (include 10 e 30) ...

int fromNumber = 10; 
int toNumber = 30; 
toNumber ++; 
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber; 

notare la differenza toNumber - fromNumber is now 21 ... (20 + 1) che restituisce i possibili risultati da 0 a 20 (inclusi) che quando aggiunti a from Number (10) risultano tra 10 e 30 (inclusi).

+2

Attenzione ai [modulo bias] di questo metodo (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias). Più sicuro da usare ['arc4random_uniform()'] (http://stackoverflow.com/questions/648739/objective-c-modulo-bias). – JohnK

27

Espansione su commento di JohnK.

Si consiglia di utilizzare la seguente funzione per restituire un numero casuale a distanza:

arc4random_uniform(51) 

che restituirà un numero casuale nel range 0-50.

Quindi è possibile aggiungere i tuoi limiti inferiori a questo come:

arc4random_uniform(51) + 50 

che restituirà un numero casuale nel range 50-100.

La ragione per cui utilizziamo arc4random_uniform(51) su arc4random() % 51 è evitare lo modulo bias. Questo è evidenziato nella pagina man come segue:

arc4random_uniform (upper_bound) restituirà un numero casuale distribuito uniformemente inferiore a upper_bound. arc4random_uniform() è raccomandato su costruzioni come `` arc4random()% upper_bound '' in quanto evita "modulo bias" quando il limite superiore non è una potenza di due.

In breve si ottiene un numero casuale distribuito uniformemente più uniforme.

+0

Hai perfettamente ragione. Dovremmo usare arc4random_uniform() !!! – alones

+0

funziona anche in rapido. – kurtanamo

3

È possibile utilizzare questo codice per la generazione di valori casuali con la gamma:

//range from 50 to 100 
int num1 = (arc4random() % 50) + 50; or 
int num1 = arc4random_uniform(50) + 50; 

//range from 0-100 
int num1 = arc4random() % 100; or 
int num1 = arc4random_uniform(100); 
1

In Swift è possibile utilizzare questo (ispirata risposta @Justyn)

func generateRandomKey(fromRange rangeFrom:Int, toRange rangeTo:Int) -> Int{ 

    let theKey = arc4random_uniform(UInt32(rangeTo - rangeFrom)) + UInt32(rangeFrom) 
    return Int(theKey) 
} 

vi darà sempre una serie casuale Numero intero.

+0

Penso che questo debba essere aggiustato in quanto il tuo intervallo sarà sempre 1 in meno che desideri. Dovresti incrementare il tuo intervallo fino a 1. 'lascia theKey = arc4random_uniform (UInt32 ((rangeTo + 1) - rangeFrom)) + UInt32 (rangeFrom)' – Justyn

+0

Inoltre, se vuoi generare una chiave casuale, dovresti probabilmente guardate invece questo: https://stackoverflow.com/a/24428458/1130260 – Justyn