È possibile impostare un intervallo di numeri quando si utilizza arc4random()? Ad esempio solo 50-100.Come selezionare l'intervallo di valori quando si utilizza arc4random()
risposta
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).
Questo dà solo da 0 a 50, non offre un intervallo compreso tra 50 e 100. – Boon
Come Run Loop, aggiungere 50. int num = (arc4random() % (51)) +50; – Nungster
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
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
È (arc4random()% (toNumber-fromNumber + 1)) + fromNumber – malinois
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
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).
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
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.
È 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 Numero intero.
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
Inoltre, se vuoi generare una chiave casuale, dovresti probabilmente guardate invece questo: https://stackoverflow.com/a/24428458/1130260 – Justyn
utilizzare il modulo per l'intervallo e aggiungere l'offset ad esso, come arc4random()% 50 + 50; fornirà un numero casuale compreso tra 50 e 99. – holex