¿Generar un número aleatorio dentro del rango?

Posible duplicado:
Generando números aleatorios en Objective-C

¿Cómo genero un número aleatorio que está dentro de un rango?

Esto es realmente un poco más difícil de conseguir realmente correcto de lo que la mayoría de las personas se dan cuenta:

 int rand_lim(int limit) { /* return a random number between 0 and limit inclusive. */ int divisor = RAND_MAX/(limit+1); int retval; do { retval = rand() / divisor; } while (retval > limit); return retval; } 

Los bashs que solo usan % (o, de manera equivalente, / ) para obtener los números en un rango casi inevitablemente introducen sesgo (es decir, algunos números se generarán más a menudo que otros).

En cuanto a por qué usar % produce resultados sesgados: a menos que el rango que desee sea un divisor de RAND_MAX, el sesgo es inevitable. Si comienzas con números pequeños, es bastante fácil ver por qué. Considere tomar 10 caramelos y tratar de dividirlos en partes iguales entre tres niños. Claramente, no se puede hacer. Si distribuyes todos los dulces, lo más cerca que puedes acercarte es que dos niños obtengan tres dulces y uno de ellos obtiene cuatro.

Solo hay una forma para que todos los niños obtengan la misma cantidad de dulces: asegúrese de no entregar la última pieza de caramelo en absoluto.

Para relacionar esto con el código anterior, comencemos por numerar los dulces del 1 al 10 y los niños del 1 al 3. La división inicial dice que ya que hay tres niños, nuestro divisor es tres. Luego sacamos un caramelo al azar del cubo, observamos su número y lo dividimos por tres y se lo damos a ese niño, pero si el resultado es mayor que 3 (es decir, hemos seleccionado el número 10 de dulces) simplemente no lo hacemos Repártelo: lo descartamos y seleccionamos otro dulce.

Por supuesto, si está utilizando una implementación moderna de C ++ (es decir, una que admite C ++ 11 o una versión más reciente), por lo general, debe usar una de las clases de distribution de la biblioteca estándar. El código anterior corresponde más estrechamente con std::uniform_int_distribution , pero la biblioteca estándar también incluye uniform_real_distribution , así como clases para varias distribuciones no uniformes (Bernoulli, Poisson, normal, quizás un par de otras que no recuerdo en este momento) ).

 int rand_range(int min_n, int max_n) { return rand() % (max_n - min_n + 1) + min_n; } 

Para fracciones:

 double rand_range(double min_n, double max_n) { return (double)rand()/RAND_MAX * (max_n - min_n) + min_n; } 

http://www.cprogramming.com/tutorial/random.html

El segundo ejemplo muestra cómo generar por rango.

Para un valor entero en el rango [min, max):

 double scale = (double) (max - min) / RAND_MAX; int val = min + floor(rand() * scale) 

Escribí esto específicamente en Obj-C para un proyecto de iPhone:

 - (int) intInRangeMinimum:(int)min andMaximum:(int)max { if (min > max) { return -1; } int adjustedMax = (max + 1) - min; // arc4random returns within the set {min, (max - 1)} int random = arc4random() % adjustedMax; int result = random + min; return result; } 

Usar:

 int newNumber = [aClass intInRangeMinimum:1 andMaximum:100]; 

Añadir sal al gusto.

 +(NSInteger)randomNumberWithMin:(NSInteger)min WithMax:(NSInteger)max { if (min>max) { int tempMax=max; max=min; min=tempMax; } int randomy=arc4random() % (max-min+1); randomy=randomy+min; return randomy; } 

Utilizo este método en una clase relacionada con números aleatorios que hice. Funciona bien para mis necesidades no exigentes, pero puede estar sesgada de alguna manera.