All pastes #1410081 Raw Edit

gocha

public lua v1 · immutable
#1410081 ·published 2009-05-02 03:41 UTC
rendered paste body
-- LCG (RNG) of SNES Madou Monogatari (ported by gocha)require("bit")function madouRNG()	return{seed = 0;init = function(rng, rs)	rng.seed = math.floor(rs)end;get = function(rng, range)	-- This multiplier returns a wrong result when the true result exceeds 255.	local madouRNGMul = function(a, b)		local a1a02, a1a04 = 0, 0		local a1a06 = a -- 0000h...ffffh		local a1a08 = b * 0x100 -- b = 00h...ffh		for x = 1, 8 do			a1a02 = bit.band(bit.lshift(a1a02, 1), 0xffff)			a1a04 = bit.band(bit.lshift(a1a04, 1), 0xffff) + bit.rshift(a1a04, 15)			local C = bit.band(a1a08, 0x8000) ~= 0			a1a08 = bit.band(bit.lshift(a1a08, 1), 0xffff)			if C then				a1a02 = a1a02 + a1a06				if a1a02 > 0xffff then					a1a04 = a1a04 + 1				end				a1a02 = bit.band(a1a02, 0xffff)			end		end		return bit.rshift(a1a04, 16) + a1a02	end	rng.seed = rng.seed * 5 + 1 + bit.band(bit.rshift(rng.seed, 14), 1)	return bit.band(bit.rshift(madouRNGMul(math.floor(range), bit.band(rng.seed, 0xff)), 8), 0xffff)end;getLua = function(rng, ...)	local arg = {...}	if #arg == 0 then		return rng:get(256) * (1.0/255.0)	elseif #arg == 1 then		local u = math.floor(arg[1])		if 1 <= u then			return rng:get(u)+1		else			error("bad argument #1 to 'getLua' (internal is empty)")		end	elseif #arg == 2 then		local l, u = math.floor(arg[1]), math.floor(arg[2])		if l <= u then			return rng:get(u-l+1)+l		else			error("bad argument #2 to 'getLua' (internal is empty)")		end	else		error("wrong number of arguments")	endend}endlocal RNG = madouRNG()RNG:init(os.time())for i = 1, 20 do	print(RNG:get(6)+1)end