¿Generando un número aleatorio único en el objetivo c?

Quiero generar un número aleatorio entre 31 y 60.

Así que he usado rand () pero creo que en algún momento dará el mismo valor. Pero necesito cada vez que me dé un nuevo valor.

¿Cómo puedo hacer esto?

preguntado el 08 de noviembre de 11 a las 12:11

Hay un rango finito entre 31 y 60, por lo que ciertamente se repetirá en algún momento (considerando que quieres los números enteros).

6 Respuestas

Utilizan arc4random(), proporcionará un buen número aleatorio y no es necesario sembrar.

rand() producirá la misma secuencia cada vez que se ejecute la aplicación, a menos que la genere con un valor único.

Entonces se trata de reducir el alcance. Una solución simple es modificar el rango y agregar el extremo inferior del rango. (Esto provocará un pequeño sesgo que debería ser aceptable).

Ejemplo:

int rangeLow = 31;
int rangeHigh = 60;
int randomNumber = arc4random() % (rangeHigh-rangeLow+1) + rangeLow;

Si desea que cada número en el rango ocurra solo una vez, @ pawan.mangal tiene un enlace a una buena solución.

respondido 08 nov., 11:17

En lugar de rand () puedes usar arc4random ()

Para obtener un valor entero de arc4random () que va de 0 a x-1, debe hacer esto:

int value = arc4random() % x;

Para obtener un número entero en el rango de 1 ax, simplemente agregue 1:

int value = (arc4random() % x) + 1;

Finalmente, si necesita generar un número de punto flotante, defina esto en su proyecto:

#define ARC4RANDOM_MAX      0x100000000'

Luego, puede usar arc4random () para obtener un valor de punto flotante (con el doble de precisión de usar rand ()), entre 0 y 100, así:

double val = floorf(((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);

respondido 08 nov., 11:17

el siguiente método generará una matriz de números aleatorios únicos en el rango bajo y alto. Como mencionó en su pregunta, necesita un número aleatorio entre 31 y 60, por lo que habrá un máximo de 29 números únicos en la matriz.

 -(void)generateRandomUniqueNumberInRange :(int)rangeLow :(int)rangeHigh{
        NSMutableArray *unqArray=[[NSMutableArray alloc] init];
        int randNum = arc4random() % (rangeHigh-rangeLow+1) + rangeLow;
        int counter=0;
        while (counter<rangeHigh-rangeLow) {
            if (![unqArray containsObject:[NSNumber numberWithInt:randNum]]) {
                [unqArray addObject:[NSNumber numberWithInt:randNum]];
                counter++;
            }else{
                randNum = arc4random() % (rangeHigh-rangeLow+1) + rangeLow;
            }

        }
        NSLog(@"UNIQUE ARRAY %@",unqArray);

    }

respondido 22 nov., 14:21

Espero que sea de ayuda:

int r = arc4random()%30+30;

respondido 08 nov., 11:17

La repetición de valores es coherente con la aleatoria. Si no puede repetir valores, puede crear una matriz con los valores posibles y eliminar aleatoriamente un número de esta matriz hasta que esté vacía, pero esto será menos aleatorio que un número aleatorio verdadero.

respondido 14 nov., 11:15

... o simplemente baraja la matriz. - NullUserException

@NullUserException ఠ_ఠ Eso permitiría resultados repetidos antes de que se eliminen todos los valores. - petervaz

Pensé que podría agregar un método que utilizo en muchos proyectos.

- (NSInteger)randomValueBetween:(NSInteger)min and:(NSInteger)max {
    return (NSInteger)(min + arc4random_uniform(max + 1);
}

Si termino usándolo en muchos archivos, generalmente declaro una macro como

#define RAND_FROM_TO(min,max) (min + arc4random_uniform(max + 1))

P.ej

NSInteger myInteger = RAND_FROM_TO(31,60) // 31, 32,..., 59, 60

Respondido el 19 de junio de 13 a las 18:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.