使用random()[Swift,Linux]

时间:2017-11-06 05:53:20

标签: arrays swift linux

我试图使用Glibc中的randr函数替换linux中的arc4random。虽然我设法对一个整数数组进行了洗牌,但是我没有使用一个字符串数组。

以下代码按预期工作:

import Foundation

extension MutableCollection {
    /// Shuffles the contents of this collection.
    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(Int(random() % numericCast(unshuffledCount) + 1 ))
            let i = index(firstUnshuffled, offsetBy: d)
            swapAt(firstUnshuffled, i)
        }
    }
}

extension Sequence {
    /// Returns an array with the contents of this sequence, shuffled.
    func shuffled() -> [Element] {
        var result = Array(self)
        result.shuffle()
        return result
    }
}

let x = [1, 2, 3].shuffled()
print(x)
// [3, 1, 2]

但是如果我对一个字符串数组做同样的事情:

let fiveStrings = ["20", "45", "70", "30"].map(String.init).shuffled()
print(fiveStrings)

它以Index out of range失败。

的错误相同
var numbers = [1, 2, 3, 4]
print(numbers.shuffle())
  • 如何使用random()?
  • 对字符串进行随机播放

1 个答案:

答案 0 :(得分:2)

代码

 let d: IndexDistance = numericCast(arc4random_uniform(numericCast(unshuffledCount)))
How do I shuffle an array in Swift?中的

在中创建一个随机数 在0unshuffledCount-1之间。实现同样的 random()使用

 let d: IndexDistance = numericCast(Int(random() % numericCast(unshuffledCount)))

没有 +1

请注意,与arc4random_uniform()

相反