mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-16 10:19:27 +02:00
57 lines
1.3 KiB
Lua
57 lines
1.3 KiB
Lua
--[[
|
|
Random number generator.
|
|
https://www.codeproject.com/Articles/25172/Simple-Random-Number-Generation
|
|
]]
|
|
local Random = {}
|
|
Random.__index = Random
|
|
|
|
function Random.new(seed1, seed2)
|
|
seed1 = seed1 or 36969
|
|
seed2 = seed2 or 18000
|
|
|
|
local random = {z = seed1, w = seed2}
|
|
setmetatable(random, Random)
|
|
|
|
return random
|
|
end
|
|
|
|
local e = 1 / (2 ^ 32 + 2)
|
|
|
|
-- return float (0, 1) exclusive
|
|
function Random.next(self)
|
|
local z, w = self.z, self.w
|
|
z = 36969 * bit32.band(z, 65535) + bit32.rshift(z, 16)
|
|
w = 18000 * bit32.band(w, 65535) + bit32.rshift(w, 16)
|
|
self.z, self.w = z, w
|
|
|
|
local ret = bit32.lshift(z, 16) + w
|
|
ret = bit32.band(ret, 4294967295)
|
|
return (ret + 1.0) * e
|
|
end
|
|
|
|
-- returns int [min, max] inclusive
|
|
function Random.next_int(self, min, max)
|
|
local u = Random.next(self)
|
|
|
|
u = u * (max - min + 1) + min
|
|
return math.floor(u)
|
|
end
|
|
|
|
function Random.next_from_point(x, y)
|
|
x = 36969 * bit32.band(x, 65535) + bit32.rshift(x, 16)
|
|
y = 18000 * bit32.band(y, 65535) + bit32.rshift(y, 16)
|
|
|
|
local ret = bit32.lshift(x, 16) + y
|
|
ret = bit32.band(ret, 4294967295)
|
|
return (ret + 1.0) * e
|
|
end
|
|
|
|
function Random.next_int_from_point(x, y, min, max)
|
|
local u = Random.next_from_point(x, y)
|
|
|
|
u = u * (max - min + 1) + min
|
|
return math.floor(u)
|
|
end
|
|
|
|
return Random
|