t-ae/xorswift
Xorshift pseudorandom number generator library.
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 available
XorshiftGenerator conforms to RandomNumberGenerator of standard library. You can use Random APIs with XorshiftGenerator.
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)Filling `UInt32` area
XorshiftGenerator has method fill which fills given area with random UInt32s. It is faster than 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
}Float/Double utility to sample from uniform/normal distributions
XorshiftGenerator also has several methods to sample multiple floating point random numbers from uniform/normal distributions. See Uniform.swift and Normal.swift for detail.
Package Metadata
Repository: t-ae/xorswift
Default branch: master
README: readme.md