Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从数组中获取一组随机项_Arrays_Swift - Fatal编程技术网

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]