mirror of
https://github.com/GayPizzaSpecifications/voxelotl-engine.git
synced 2025-08-03 13:11:33 +00:00
use arc4random to seed non-csprng, fleshes out random subsystem
This commit is contained in:
33
Sources/Voxelotl/Random/DarwinRandom.swift
Normal file
33
Sources/Voxelotl/Random/DarwinRandom.swift
Normal file
@ -0,0 +1,33 @@
|
||||
public struct DarwinRandom: RandomProvider {
|
||||
public typealias Output = Int
|
||||
|
||||
public static var min: Int { 0x00000000 }
|
||||
public static var max: Int { 0x7FFFFFFF }
|
||||
|
||||
private var state: Int
|
||||
|
||||
init() {
|
||||
self.state = 0
|
||||
}
|
||||
|
||||
public init(seed: Int) {
|
||||
self.state = seed
|
||||
}
|
||||
|
||||
mutating public func seed(with seed: Int) {
|
||||
self.state = seed
|
||||
}
|
||||
|
||||
mutating public func next() -> Int {
|
||||
if self.state == 0 {
|
||||
self.state = 123459876
|
||||
}
|
||||
let hi = self.state / 127773
|
||||
let lo = self.state - hi * 127773
|
||||
self.state = 16807 * lo - 2836 * hi
|
||||
if self.state < 0 {
|
||||
self.state += Self.max
|
||||
}
|
||||
return self.state % (Self.max + 1)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user