" George Marsaglia's Multiply-with-carry Random Number Generator
" Modified to work within Vim's semantics
let s:m_w = 1 + getpid()
let s:m_z = localtime()
" not sure of the wisdom of generating a full 32-bit RN here
" and then using abs() on the sucker. Feedback welcome.
function! rng#rand(...)
if a:0 == 0
let s:m_z = (36969 * and(s:m_z, 0xffff)) + (s:m_z / 65536)
let s:m_w = (18000 * and(s:m_w, 0xffff)) + (s:m_w / 65536)
return (s:m_z * 65536) + s:m_w " 32-bit result
elseif a:0 == 1 " We return a number in [0, a:1] or [a:1, 0]
return a:1 < 0 ? rng#rand(a:1,0) : rng#rand(0,a:1)
else " if a:0 >= 2
return abs(rng#rand()) % (abs(a:2 - a:1) + 1) + a:1
endif
endfunction