repetir rango que programa números numeros llenar haz generar escriba entre enteros con clase arreglo aleatorios ios swift random swift2

ios - que - math random() rango de numeros



Función de generador de números aleatorios que no se repite (4)

¿Swift por defecto tiene un generador de números aleatorios que devuelve el mismo número solo una vez?

Por ejemplo, elige un número en el rango 1,2,3,4,5. Devuelve ese número aleatorio (digamos 3). En el siguiente ciclo, solo selecciona de 1,2,4,5 y así sucesivamente.

EDITAR: Esto es lo que terminé usando. Devuelve una matriz de enteros de 0 a 5 y se probó en el patio de recreo. Tenga en cuenta que esto está destinado a ser utilizado cuando está eligiendo entre un gran conjunto de enteros y no solo 6.

func generateRandomArray() -> [Int]{ var randomImages: [Int] = [Int]() var newRandomNumber = Int(arc4random_uniform(UInt32(6))) while (randomImages.count < 6) { if (randomImages.contains(newRandomNumber) == false){ randomImages.append(newRandomNumber) } newRandomNumber = Int(arc4random_uniform(UInt32(6))) } return randomImages }


De la documentación de Apple:

Un conjunto almacena valores distintos del mismo tipo en una colección sin un orden definido.

Esto parece ser exactamente lo que buscas, por lo que hacer una matriz parece un poco desaconsejable ...

var values : Set<Int> = [] var value : Int { return Int(arc4random() % 6 + 1) } while values.count < 6 { values.insert(value) }

Y probablemente quiera echar un vistazo a esos valores en algún momento:

for value in values { println(value) }


Puede hacer este truco, Agregar el rango de números desde el que desea obtener el resultado aleatorio ... a un NSMutableArray o NSMutableSet (para asegurarse de que solo haya 1). Itera a través de la matriz-

for(int i=0;i<myMutableArray .count;i++){ int randomIndex = arc4random_uniform(myMutableArray.count); int myNumber = [[myMutableArray objectAtIndex:randomIndex]intValue]; // edited NSLog(@"My random number-%i",myNumber);//this is your generated random number [myMutableArray removeObjectAtIndex:randomIndex]; }

Supongo que esto haría el tric, pero si lo sabe, NSMutableArray no puede tomar el tipo de datos Primitive, solo Objects como NSNumber .

EDITAR

esta línea no está escrita y justifica por qué estoy convirtiendo el NSNumber de nuevo en un interger porque, al agregar el entero en la matriz, debe convertirse a NSNumber |

[ myMutableArray addObject:[NSNumber numberWithInt:2]];

Entonces, en el bucle for cuando myMutableArray el objeto de myMutableArray obtengo un NSNumber y para simplificarlo coloco ese objeto (objeto NSNumber) de nuevo en un entero.


Simplemente almacene el último número aleatorio en una variable y verifique el siguiente número aleatorio en un ciclo while. Mientras que el nuevo número aleatorio es el mismo que el último número aleatorio, genere un nuevo número aleatorio. Una vez que el nuevo número aleatorio generado no es el mismo que el último número aleatorio, el ciclo while finaliza y actualizamos el último número aleatorio.

var lastRandomNumber = 0 var newRandomNumber = 0 func gernerateRandomNumber() { newRandomNumber = Int(arc4random_uniform(5)+1) while newRandomNumber == lastRandomNumber { newRandomNumber = Int(arc4random_uniform(5)+1) } lastRandomNumber = newRandomNumber }


Este tipo de generador no se llama generador de "números aleatorios", sino que generalmente es un "Mezcla" o "Permutación". Tienes que decir cuántos artículos hay primero. De lo contrario, lo que estás proponiendo no tiene ningún sentido.

ver respuesta aquí: ¿Cómo mezclo una matriz en Swift?