Domanda

Posso impostare un intervallo di numeri quando si utilizza arc4random ()? Per esempio 50-100 solo.

È stato utile?

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>

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top