two rand_max number and c random

rand_max - ¿Cuál es la diferencia entre arc4random y arc4random_uniform?



random number in c between 1 and 100 (1)

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?


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

Del 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 comprender el sesgo de módulo se supone 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.