所以我使用了Martin R的建议,使用GamePlayKit
的GKMersenneTwisterRandomSource
来创建一个符合随机数生成器协议的类,在像Int.random()
这样的函数中可以使用该类的实例:
import GameplayKit
class SeededGenerator: RandomNumberGenerator {
let seed: UInt64
private let generator: GKMersenneTwisterRandomSource
convenience init() {
self.init(seed: 0)
}
init(seed: UInt64) {
self.seed = seed
generator = GKMersenneTwisterRandomSource(seed: seed)
}
func next<T>(upperBound: T) -> T where T : FixedWidthInteger, T : UnsignedInteger {
return T(abs(generator.nextInt(upperBound: Int(upperBound))))
}
func next<T>() -> T where T : FixedWidthInteger, T : UnsignedInteger {
return T(abs(generator.nextInt()))
}
}
使用方法:
// Make a random seed and store in a database
let seed = UInt64.random(in: UInt64.min ... UInt64.max)
var generator = Generator(seed: seed)
// Or if you just need the seeding ability for testing,
// var generator = Generator()
// uses a default seed of 0
let chars = ['a','b','c','d','e','f']
let randomChar = chars.randomElement(using: &generator)
let randomInt = Int.random(in: 0 ..< 1000, using: &generator)
// etc.
通过将GKMersenneTwisterRandomSource
的种子功能与标准库的随机函数(例如用于数组的.randomElement()
和用于 Int、Bool、Double 等的.random()
)的简单性相结合,使我能够灵活地实现所需。
RandomNumberGenerator
吗?GamePlayKit 有各种随机数生成器,例如请参见 https://dev59.com/W6_la4cB1Zd3GeqPzuBU#53355215。 - Martin R