Я новичок в Swift и в программировании логики в целом, так что терпите меня
Как вы можете сгенерировать случайное число от 0 до 9 в Swift, не повторяя последнее сгенерированное число? Как и в том же номере не будет подходить дважды подряд.
Я новичок в Swift и в программировании логики в целом, так что терпите меня
Как вы можете сгенерировать случайное число от 0 до 9 в Swift, не повторяя последнее сгенерированное число? Как и в том же номере не будет подходить дважды подряд.
Сохраните предыдущий сгенерированный номер в переменной и сравните сгенерированный номер с предыдущим номером. Если они соответствуют генерации нового случайного числа. Повторите генерацию новых чисел, пока они не совпадут.
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
}
мое решение, я думаю, его легко понять
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)
}
Обновление для 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
}
Самый простой способ сделать это - повторить/пока:
let current = ...
var next: Int
repeat {
next = Int(arc4random_uniform(9))
} while current == next
// Use `next`
Поместите все значения, которые вы хотите в массив, сгенерируйте случайное число с помощью arc4random_uniform (SIZEOFARRAY) и вытащите индекс случайного значения из массива, а затем повторите этот процесс до тех пор, пока массив не станет пустым.