Xorswift

Xorshift 伪随机数生成器库。
专门用于生成海量随机数。

Xorshift 是

有关 Xorshift 本身的更多细节,请参阅原始论文。

XorshiftGenerator

struct XorshiftGenerator: RandomNumberGenerator {
    /// Create `XorshiftGenerator`.
    /// - precondition: At least one of seeds must be non-zero.
    public init(x: UInt32, y: UInt32, z: UInt32, w: UInt32)

    /// Create `XorshiftGenerator` seeded with another `generator`.
    public init<G: RandomNumberGenerator>(using generator: inout G)

    /// Create `XorshiftGenerator` seeded with `SystemRandomNumberGenerator`.
    public init()
}

提供 Random API

XorshiftGenerator 符合标准库的 RandomNumberGenerator 协议。
您可以将 Random APIXorshiftGenerator 一起使用。

var gen = XorshiftGenerator()
Int.random(in: 0..<10, using: &gen)
UInt.random(in: 0..<10, using: &gen)
Float.random(in: 0..<10, using: &gen)
Double.random(in: 0..<10, using: &gen)

let array = [0, 1, 2, 3]
array.randomElement(using: &gen)

填充 UInt32 区域

XorshiftGenerator 具有 fill 方法,该方法使用随机 UInt32 值填充给定的区域。
它比 arc4random_buf 更快。

func testPerformance_arc4random() {
    let count = 1_000_000
    var a = [UInt32](repeating: 0, count: count)
    measure {
        for _ in 0..<100 {
            arc4random_buf(&a, MemoryLayout<UInt32>.size * a.count)
        }
    } // 0.136sec
}

func testPerformance_xorshift() {
    let count = 1_000_000
    var a = [UInt32](repeating: 0, count: count)
    measure {
        var gen = XorshiftGenerator()
        for _ in 0..<100 {
            gen.fill(start: &a, count: a.count)
        }
    } // 0.067sec
}

浮点/双精度实用工具,用于从均匀/正态分布中采样

XorshiftGenerator 还提供多种方法,用于从均匀/正态分布中采样多个浮点随机数。
有关详细信息,请参阅 Uniform.swiftNormal.swift