Advertisement
Guest User

gocha

a guest
Apr 12th, 2009
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.98 KB | None | 0 0
  1. -- XorShift: A random number generator
  2. -- ported to Lua by gocha
  3.  
  4. module("xorshift", package.seeall)
  5.  
  6. require "bit"
  7.  
  8. local seed128 = {}
  9.  
  10. function randomseed(s)
  11.     for i = 0, 3 do
  12.         -- s = 1812433253 * (bit.bxor(s, bit.rshift(s, 30))) + i
  13.         s = bit.bxor(s, bit.rshift(s, 30))
  14.         local s_lo = bit.band(s, 0xffff)
  15.         local s_hi = bit.rshift(s, 16)
  16.         local s_lo2 = bit.band(1812433253 * s_lo, 0xffffffff)
  17.         local s_hi2 = bit.band(1812433253 * s_hi, 0xffff)
  18.         s = bit.bor(bit.lshift(bit.rshift(s_lo2, 16) + s_hi2, 16),
  19.             bit.band(s_lo2, 0xffff))
  20.         -- s = bit.band(s + i, 0xffffffff)
  21.         local s_lim = -bit.tobit(s)
  22.         -- assumes i<2^31
  23.         if (s_lim > 0 and s_lim <= i) then
  24.             s = i - s_lim
  25.         else
  26.             s = s + i
  27.         end
  28.         seed128[i+1] = s
  29.     end
  30. end
  31.  
  32. function random_int32()
  33.     local t = bit.bxor(seed128[1], bit.lshift(seed128[1], 11))
  34.     seed128[1], seed128[2], seed128[3] = seed128[2], seed128[3], seed128[4]
  35.     seed128[4] = bit.bxor(bit.bxor(seed128[4], bit.rshift(seed128[4], 19)), bit.bxor(t, bit.rshift(t, 8)))
  36.     return seed128[4]
  37. end
  38.  
  39. function random(...)
  40.     -- local r = xorshift.random_int32() * (1.0/4294967296.0)
  41.     local rtemp = xorshift.random_int32()
  42.     local r = (bit.band(rtemp, 0x7fffffff) * (1.0/4294967296.0)) + (bit.tobit(rtemp) < 0 and 0.5 or 0)
  43.     local arg = {...}
  44.     if #arg == 0 then
  45.         return r
  46.     elseif #arg == 1 then
  47.         local u = math.floor(arg[1])
  48.         if 1 <= u then
  49.             return math.floor(r*u)+1
  50.         else
  51.             error("bad argument #1 to 'random' (internal is empty)")
  52.         end
  53.     elseif #arg == 2 then
  54.         local l, u = math.floor(arg[1]), math.floor(arg[2])
  55.         if l <= u then
  56.             return math.floor((r*(u-l+1))+l)
  57.         else
  58.             error("bad argument #2 to 'random' (internal is empty)")
  59.         end
  60.     else
  61.         error("wrong number of arguments")
  62.     end
  63. end
  64.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement