Come selezionare intervallo di valori quando si utilizza arc4random ()
-
26-09-2019 - |
Domanda
Posso impostare un intervallo di numeri quando si utilizza arc4random ()? Per esempio 50-100 solo.
Soluzione
Come sottolineato in altri post qui sotto, è meglio utilizzare arc4random_uniform
. (Quando questa risposta è stato originariamente scritto, arc4random_uniform
non era disponibile). Oltre ad evitare la polarizzazione modulo di arc4random() % x
, evita anche un problema semina con arc4random
quando utilizzato ricorsivo in tempi ridotti.
arc4random_uniform(4)
genererà 0, 1, 2 o 3. In questo modo è possibile utilizzare:
arc4random_uniform(51)
e semplicemente aggiungere 50 al risultato da ottenere un range compreso tra 50 e 100 (compreso).
Altri suggerimenti
Per espandere su Jöhnk commento.
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
a 50
.
Quindi è possibile aggiungere i tuoi limiti inferiori a questo tipo:
arc4random_uniform(51) + 50
che restituirà un numero casuale nel range 50
a 100
.
Il motivo usiamo arc4random_uniform(51)
sopra arc4random() % 51
è quello di evitare la modulo polarizzazione . Questo viene evidenziato nella pagina man come segue:
arc4random_uniform (upper_bound) restituisce un numero casuale uniformemente distribuito meno di upper_bound. arc4random_uniform () è preferibile a costruzioni come `` arc4random ()% upper_bound '' in quanto evita "polarizzazione modulo" quando il limite superiore non è una potenza di due.
In breve si ottiene un numero casuale più uniformemente distribuito generato.
int fromNumber = 10;
int toNumber = 30;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;
genererà randon number
tra 10
e 30
, vale a dire 11,12,13,14......29
È 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);
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 di numeri interi.
In molte situazioni 10-30 significherebbe inclusiva, (include 10 e 30) ...
int fromNumber = 10;
int toNumber = 30;
toNumber ++;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;
Si noti la differenza ToNumber - fromNumber è ora 21 ... (20 + 1) che produce i risultati possibili da 0 thru 20 (compreso) che quando aggiunto fromNumber (10) provoca 10 del attraverso 30 (compreso) <. / p>