Come generare un numero casuale in Swift senza ripetere il numero casuale precedente?

Sono piuttosto nuovo di Swift e della logica di programmazione in generale, quindi portami con me

Come si può generare un numero casuale compreso tra 0 e 9 in Swift senza ripetere l’ultimo numero generato? Come nello stesso numero non comparirà due volte di seguito.

Memorizza il numero generato precedente in una variabile e confronta il numero generato con il numero precedente. Se corrispondono generano un nuovo numero casuale. Ripeti la generazione di nuovi numeri fino a quando non corrispondono.

var previousNumber: UInt32? // used in randomNumber() func randomNumber() -> UInt32 { var randomNumber = arc4random_uniform(10) while previousNumber == randomNumber { randomNumber = arc4random_uniform(10) } previousNumber = randomNumber return randomNumber } 

la mia soluzione, penso che sia facile da capire

 var nums = [0,1,2,3,4,5,6,7,8,9] while nums.count > 0 { // random key from array let arrayKey = Int(arc4random_uniform(UInt32(nums.count))) // your random number let randNum = nums[arrayKey] // make sure the number isnt repeated nums.removeAtIndex(arrayKey) } 

Ecco un bel trucco per scegliere ugualmente dai numeri che non erano solo scelti in precedenza.

Hai 10 numeri, ma vuoi solo selezionare tra 9 numeri (da 0 a 9, ma escludendo il numero precedente). Se riduci l’intervallo di 1, puoi selezionare tra 9 numeri casuali e quindi sostituire solo un numero ripetuto con il precedente numero superiore dell’intervallo. In questo modo, devi generare un solo numero casuale ogni volta e ottieni uniformità:

 var previousNumber = arc4random_uniform(10) // seed the previous number func randomNumber() -> UInt32 { var randomNumber = arc4random_uniform(9) // generate 0...8 if randomNumber == previousNumber { randomNumber = 9 } previousNumber = randomNumber return randomNumber } 

Il modo più semplice per farlo è con repeat / while:

 let current = ... var next: Int repeat { next = Int(arc4random_uniform(9)) } while current == next // Use `next` 

Metti tutti i valori desiderati in una matrice, genera un numero casuale usando arc4random_uniform (SIZEOFARRAY) e tira l’indice del valore casuale dall’array, quindi ripeti questo processo finché l’array non è vuoto.