Guest User

Untitled

a guest
Nov 29th, 2023
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 1.56 KB | None | 0 0
  1. using Dates
  2. using Random
  3.  
  4. module Utils
  5.  
  6. # Marsaglia Random Number Generator struct equivalent
  7. mutable struct MarsagliaRng
  8.     q::Vector{UInt32}
  9.     carry::UInt32
  10.     mwc256_initialized::Bool
  11.     mwc256_seed::Int32
  12.     i::UInt8
  13.  
  14.     function MarsagliaRng(seed::Vector{UInt8})
  15.         q = zeros(UInt32, 256)
  16.         carry = 362436
  17.         mwc256_initialized = false
  18.         mwc256_seed = reinterpret(Int32, seed)[1]
  19.         i = 255
  20.         new(q, carry, mwc256_initialized, mwc256_seed, i)
  21.     end
  22. end
  23.  
  24. # Default constructor using system time for seeding
  25. function MarsagliaRng()
  26.     ts_nano = UInt8(nanosecond(now()))
  27.     seed = [ts_nano, ts_nano >>> 8, ts_nano >>> 16, ts_nano >>> 24]
  28.     MarsagliaRng(seed)
  29. end
  30.  
  31. # Random number generator functions
  32. function next_u32(rng::MarsagliaRng)::UInt32
  33.     a = UInt64(809430660)
  34.  
  35.     if !rng.mwc256_initialized
  36.         j = UInt32(rng.mwc256_seed)
  37.         c1 = UInt32(69069)
  38.         c2 = UInt32(12345)
  39.         rng.mwc256_initialized = true
  40.         for k in 1:256
  41.             j = (c1 * j + c2) % UInt32
  42.             rng.q[k] = j
  43.         end
  44.     end
  45.  
  46.     rng.i = (rng.i + 1) % 256
  47.     t = a * UInt64(rng.q[rng.i+1]) + UInt64(rng.carry)
  48.     rng.carry = (t >> 32)
  49.     rng.q[rng.i+1] = t % UInt32
  50.  
  51.     return rng.q[rng.i+1]
  52. end
  53.  
  54.  
  55.  
  56. function next_u64(rng::MarsagliaRng)::UInt64
  57.     UInt64(next_u32(rng))
  58. end
  59.  
  60. # Sample function for generating a Float64
  61. function rand(rng::MarsagliaRng)::Float64
  62.     mult = 1.0 / typemax(UInt32)
  63.     mult * next_u32(rng)
  64. end
  65.  
  66. export MarsagliaRg, next_u32, rand
  67.  
  68. end
Advertisement
Add Comment
Please, Sign In to add comment