【发布时间】:2016-06-17 03:42:17
【问题描述】:
我需要在每次执行我的应用时启动相同的随机数列表。 srand/rand 不再存在。那我该怎么办?
private extension Array {
private func randomValues(_ seed: UInt32, num: Int) -> [Element] {
srand (seed)
var indices = [Int]()
indices.reserveCapacity(num)
let range = 0..<self.count
for _ in 0..<num {
var random = 0
repeat {
random = randomNumberInRange(range)
} while indices.contains(random)
indices.append(random)
}
return indices.map { self[$0] }
}
【问题讨论】:
-
使用 arc4random() 代替 srand(seed)
-
arc4random()无法播种。您确实获得了质量更好的随机数,但如果您的要求每次都要求使用相同的随机数集,那就不合适了。 -
看起来您必须将代码移动到 C/Obj-C。 Apple 要么没有及时将它移植到 Beta 1,要么非常严厉地强迫你使用“好的”随机数生成器
-
是的,但你所说的好是什么意思?更高质量的一代?但无论如何,有时播种是必须的。如果苹果不提供种子生成,我会从树上掉下来。
-
在生成器自我重复之前,可预测性较差,周期较长。请参阅我对愚蠢的 C 包装器的回答