Pregunta ¿Cuál es la diferencia entre arc4random y arc4random_uniform? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Así que he visto publicaciones antiguas sobre la diferencia entre aleatorio y arc4random en Obj. C, y he visto respuestas a esto en línea, pero realmente no entendí las respuestas, así que esperaba que alguien aquí pudiera explicarlo de una manera más fácil de entender.

¿Cuál es la diferencia entre usar arc4random y arc4random_uniform para generar números aleatorios?


33
2018-04-29 22:39


origen


Respuestas:


arc4random devuelve un número entero entre 0 y (2 ^ 32) -1 mientras arc4random_uniform devuelve un número entero entre 0 y el límite superior lo pasas.

De man 3 arc4random:

arc4random_uniform () devolverá un número aleatorio distribuido uniformemente 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.

Por ejemplo, si quiere un número entero entre 0 y 4, podría usar

arc4random() % 5

o

arc4random_uniform(5)

El uso del operador de módulo en este caso introduce el sesgo de módulo, por lo que es mejor usar arc4random_uniform.

Para entender el sesgo de módulo asuma que arc4random tenía un rango mucho más pequeño. En lugar de 0 a (2 ^ 32) -1, era 0 a (2 ^ 4) -1. Si realizas% 5 en cada número en ese rango, obtendrás 0 cuatro veces y 1, 2, 3 y 4 tres veces cada uno, lo que hace que 0 sea más probable. Esta diferencia se vuelve menos significativa cuando el rango es mucho mayor, pero es mejor evitar el uso del módulo.


73
2018-04-29 22:54