抢夺2个不同的randomElements?

时间:2018-10-27 21:31:36

标签: arrays swift random

我试图在这样的字符串中获取2个不同的随机值

    var players = ["Jack, John, Michael, Peter"]
    var playersArray = ["\(players.randomElement) and \(players.randomElement) has to battle")

我该怎么做,因此它具有2个不同的值?

1 个答案:

答案 0 :(得分:0)

前一段时间,我创建了一个类RandomObjects,该类维护一个对象数组,可用于一次从该数组中提供随机的,非重复的对象。它的工作方式是维护一个索引数组,并从索引数组中删除一个索引,直到耗尽为止。

甚至提供了在返回所有值之后“重新填充”索引的规定,以及避免在重新填充索引数组之后返回相同值的逻辑。

它是用Swift 2编写的,但我刚刚将其更新为Swift 4并将其发布到了GitHub:

https://github.com/DuncanMC/RandomObjects.git

该类的定义如下:

class RandomObjects<T> {
    var objectsArray: [T]
    var indexes: [Int]!
    var oldIndex: Int?

该类代码的关键是这个功能:

public func randomObject(refillWhenEmpty: Bool = true) -> T? {
    var randomIndex: Int
    var objectIndex: Int

    if refillWhenEmpty {
        fillIndexesArray()
    } else if indexes.isEmpty {
        return nil
    }
    repeat {
        randomIndex = Int(arc4random_uniform(UInt32(indexes.count)))
        objectIndex = indexes[randomIndex]
    } while objectIndex == oldIndex

    indexes.remove(at: randomIndex)

    oldIndex = objectIndex
    return objectsArray[objectIndex];
}

仅当您遍历数组中的每个对象并重新填充了索引数组时,才需要对objectIndex == oldIndex进行检查。这样可以确保您不会重复上一个条目。