Как создать случайное число в Swift без повторения предыдущего случайного числа?

Я новичок в Swift и в программировании логики в целом, так что терпите меня

Как вы можете сгенерировать случайное число от 0 до 9 в Swift, не повторяя последнее сгенерированное число? Как и в том же номере не будет подходить дважды подряд.

Ответ 1

Сохраните предыдущий сгенерированный номер в переменной и сравните сгенерированный номер с предыдущим номером. Если они соответствуют генерации нового случайного числа. Повторите генерацию новых чисел, пока они не совпадут.

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
}

Ответ 2

мое решение, я думаю, его легко понять

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)
}

Ответ 3

Обновление для Swift 5

Вот хороший трюк, чтобы выбрать одинаково из числа, которые не были выбраны ранее.

У вас есть 10 номеров, но вы хотите выбрать только из 9 номеров (от 0 до 9, но исключая предыдущий номер). Если вы уменьшите свой диапазон на 1, вы можете выбрать одно из 9 случайных чисел, а затем просто заменить повторное число предыдущим старшим числом диапазона. Таким образом, вам нужно генерировать только одно случайное число каждый раз, и вы получите единообразие.

Это может быть реализовано как Int.random(in:excluding:) где вы передаете значение, которое хотите exclude.

extension Int {
    static func random(in range: ClosedRange<Int>, excluding x: Int) -> Int {
        if range.contains(x) {
            let r = Int.random(in: Range(uncheckedBounds: (range.lowerBound, range.upperBound)))
            return r == x ? range.upperBound : r
        } else {
            return Int.random(in: range)
        }
    }
}

Пример:

// Generate 30 numbers in the range 1...3 without repeating the
// previous number  
var r = Int.random(in: 1...3)
for _ in 1...30 {
    r = Int.random(in: 1...3, excluding: r)
    print(r, terminator: " ")
}
print()

1 3 2 1 2 1 3 2 1 3 1 3 2 3 1 2 3 2 1 3 2 1 3 1 2 3 2 1 2 1 3 2 3 2 1 3 1 2 1 2


Предыдущий ответ:

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
}

Ответ 4

Самый простой способ сделать это - повторить/пока:

let current = ...
var next: Int

repeat {
    next = Int(arc4random_uniform(9))
} while current == next

// Use `next`

Ответ 5

Поместите все значения, которые вы хотите в массив, сгенерируйте случайное число с помощью arc4random_uniform (SIZEOFARRAY) и вытащите индекс случайного значения из массива, а затем повторите этот процесс до тех пор, пока массив не станет пустым.