Arrays 从数组中获取一组随机项
我想写一个扩展,它允许我放入一个数组,并从该数组返回一组元素,而不需要重复项。我该怎么做?这是我到目前为止所拥有的,但并不完美。它不考虑重复,它似乎不是最好的方式来完成这一点。我在想,使用一套复制品可能是有道理的Arrays 从数组中获取一组随机项,arrays,swift,Arrays,Swift,我想写一个扩展,它允许我放入一个数组,并从该数组返回一组元素,而不需要重复项。我该怎么做?这是我到目前为止所拥有的,但并不完美。它不考虑重复,它似乎不是最好的方式来完成这一点。我在想,使用一套复制品可能是有道理的 extension Array { func randomElement(numberOfItems:Int) -> [Element] { var finalReturn = Array() for i in 0..<numbe
extension Array {
func randomElement(numberOfItems:Int) -> [Element] {
var finalReturn = Array()
for i in 0..<numberOfItems {
finalReturn.append(self[Int(arc4random_uniform(UInt32(self.count)))])
}
return finalReturn
}
}
以下是一种方法:
extension Array {
func randomElements(number: Int) -> [Element] {
guard number > 0 else { return [Element]() }
var remaining = self
var chosen = [Element]()
for _ in 0 ..< number {
guard !remaining.isEmpty else { break }
let randomIndex = Int(arc4random_uniform(UInt32(remaining.count)))
chosen.append(remaining[randomIndex])
remaining.remove(at: randomIndex)
}
return chosen
}
}
根据您的用例,当请求的元素数大于数组中的元素数时,您可能希望更改行为
在上面的示例中,如果是这种情况,则返回可能的最大元素数(原始数组中的元素数)。或者,您可以给出一个错误或返回nil。我的解决方案对您有用吗?
extension Array {
func randomElements(number: Int) -> [Element] {
guard number > 0 else { return [Element]() }
var remaining = self
var chosen = [Element]()
for _ in 0 ..< number {
guard !remaining.isEmpty else { break }
let randomIndex = Int(arc4random_uniform(UInt32(remaining.count)))
chosen.append(remaining[randomIndex])
remaining.remove(at: randomIndex)
}
return chosen
}
}
let testArray = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let randomThree = testArray.randomElements(number: 3)
// randomThree is [1, 5, 4]