将不重复的随机数添加到数组中
Adding non-repeating random numbers to an array
您好,我正在尝试从非重复随机数创建一个数组。
我在下面写了代码 numberOfAnimals
,目前 10 显示数组中有多少数字。当我在操场上 运行 这个时,我得到
"[6, 5, 1, 4, 7, 0]\n" 作为 print 语句的输出,所以总共有 6 个数字而不是 10 个。为了避免这种情况,我减少了 i
的值if
如果数组中已经存在随机数的语句,在这种情况下 for 循环需要一个额外的循环才能达到 10 但它仍然不起作用。
你能检查一下错误在哪里或者给我另一个可行的代码建议吗?
import UIKit
var array = [Int]()
var max : Int = 10
var numberOfAnimals : Int = 10
for var i in 0..<numberOfAnimals {
let randomNumber : Int = Int(arc4random_uniform(UInt32(max)))
if array.contains(randomNumber) {
i = i - 1
} else {
array.append(randomNumber)
}
}
print(array)
为什么不使用 while 循环直到数组中有十个数字。
while array.count < 10 {
...
if !array.contains(randomNumber) {
array.append(randomNumber)
}
}
如果你重复你的循环直到每个数字都被命中,你的算法的最坏情况运行时间是无限的。据我了解你的问题,你有一个固定大小和固定元素的数组,你想对其进行洗牌,那么为什么不这样做呢?我在 another thread:
中找到了一个不错的算法
extension MutableCollection {
mutating func shuffle() {
let c = count
guard c > 1 else { return }
for (firstUnshuffled, unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) {
let d: IndexDistance = numericCast(arc4random_uniform(numericCast(unshuffledCount)))
let i = index(firstUnshuffled, offsetBy: d)
swapAt(firstUnshuffled, i)
}
}
}
let numberOfAnimals = [1,2,3,4,5,6,7,8,9,10]
array.shuffle()
print(array)
如果您能负担得起额外的 space 并实现一个集合,我建议对@Joakim Danielson 的回答稍作修改 - 如果数组不是至关重要,您可能需要考虑一个也为您的实施设置,只需 $0.02
var array = [Int]()
var seen = Set<Int>()
let max = 10
while array.count < max {
let number = Int(arc4random_uniform(UInt32(max)))
if seen.contains(number) {
continue
}
array.append(number)
seen.insert(number)
}
print(array)
您好,我正在尝试从非重复随机数创建一个数组。
我在下面写了代码 numberOfAnimals
,目前 10 显示数组中有多少数字。当我在操场上 运行 这个时,我得到
"[6, 5, 1, 4, 7, 0]\n" 作为 print 语句的输出,所以总共有 6 个数字而不是 10 个。为了避免这种情况,我减少了 i
的值if
如果数组中已经存在随机数的语句,在这种情况下 for 循环需要一个额外的循环才能达到 10 但它仍然不起作用。
你能检查一下错误在哪里或者给我另一个可行的代码建议吗?
import UIKit
var array = [Int]()
var max : Int = 10
var numberOfAnimals : Int = 10
for var i in 0..<numberOfAnimals {
let randomNumber : Int = Int(arc4random_uniform(UInt32(max)))
if array.contains(randomNumber) {
i = i - 1
} else {
array.append(randomNumber)
}
}
print(array)
为什么不使用 while 循环直到数组中有十个数字。
while array.count < 10 {
...
if !array.contains(randomNumber) {
array.append(randomNumber)
}
}
如果你重复你的循环直到每个数字都被命中,你的算法的最坏情况运行时间是无限的。据我了解你的问题,你有一个固定大小和固定元素的数组,你想对其进行洗牌,那么为什么不这样做呢?我在 another thread:
中找到了一个不错的算法extension MutableCollection {
mutating func shuffle() {
let c = count
guard c > 1 else { return }
for (firstUnshuffled, unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) {
let d: IndexDistance = numericCast(arc4random_uniform(numericCast(unshuffledCount)))
let i = index(firstUnshuffled, offsetBy: d)
swapAt(firstUnshuffled, i)
}
}
}
let numberOfAnimals = [1,2,3,4,5,6,7,8,9,10]
array.shuffle()
print(array)
如果您能负担得起额外的 space 并实现一个集合,我建议对@Joakim Danielson 的回答稍作修改 - 如果数组不是至关重要,您可能需要考虑一个也为您的实施设置,只需 $0.02
var array = [Int]()
var seen = Set<Int>()
let max = 10
while array.count < max {
let number = Int(arc4random_uniform(UInt32(max)))
if seen.contains(number) {
continue
}
array.append(number)
seen.insert(number)
}
print(array)