ios objective-c arc4random

ios - Cómo seleccionar el rango de valores cuando se usa arc4random()



objective-c (6)

¿Puedo establecer un rango de números cuando uso arc4random ()? Por ejemplo, 50-100 solamente.


En Swift puedes usar esto (inspirado por la respuesta de @Justyn )

func generateRandomKey(fromRange rangeFrom:Int, toRange rangeTo:Int) -> Int{ let theKey = arc4random_uniform(UInt32(rangeTo - rangeFrom)) + UInt32(rangeFrom) return Int(theKey) }

Siempre te dará un Entero de rango aleatorio.


En muchas situaciones, 10 a 30 significa inclusivo, (incluye 10 y 30) ...

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

Observe que la diferencia conNumber - fromNumber ahora es 21 ... (20 + 1), lo que arroja los posibles resultados de 0 a 20 (inclusive) que, cuando se agrega a fromNumber (10), resulta de 10 a 30 (inclusive).


Para ampliar el comentario de JohnK.

Se sugiere utilizar la siguiente función para devolver un número aleatorio a distancia:

arc4random_uniform(51)

que devolverá un número aleatorio en el rango de 0 a 50 .

Entonces puedes agregar tus límites inferiores a esto como:

arc4random_uniform(51) + 50

que devolverá un número aleatorio en el rango de 50 a 100 .

La razón por la que usamos arc4random_uniform(51) sobre arc4random() % 51 es para evitar el sesgo de módulo . Esto se resalta en la página de manual de la siguiente manera:

arc4random_uniform (upper_bound) devolverá un número aleatorio uniformemente distribuido menos que upper_bound. arc4random_uniform () se recomienda sobre construcciones como `` arc4random ()% upper_bound '''' ya que evita el "sesgo de módulo" cuando el límite superior no es una potencia de dos.

En resumen, obtienes un número aleatorio distribuido más uniformemente.


Puede usar este código para generar valores aleatorios con rango:

//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);


Como se señala en otras publicaciones a continuación, es mejor usar arc4random_uniform . (Cuando esta respuesta se escribió originalmente, arc4random_uniform no estaba disponible). Además de evitar el sesgo de módulo de arc4random() % x , también evita un problema de siembra con arc4random cuando se usa recursivamente en marcos de tiempo cortos.

arc4random_uniform(4)

generará 0, 1, 2 o 3. Por lo tanto, podría usar:

arc4random_uniform(51)

y simplemente agregue 50 al resultado para obtener un rango entre 50 y 100 (inclusive).


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

randon number entre 10 y 30 , es decir, 11,12,13,14......29