<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://glolfwiki.sibr.dev/index.php?action=history&amp;feed=atom&amp;title=Module%3AMt19937ar</id>
	<title>Module:Mt19937ar - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://glolfwiki.sibr.dev/index.php?action=history&amp;feed=atom&amp;title=Module%3AMt19937ar"/>
	<link rel="alternate" type="text/html" href="https://glolfwiki.sibr.dev/index.php?title=Module:Mt19937ar&amp;action=history"/>
	<updated>2026-06-02T20:02:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://glolfwiki.sibr.dev/index.php?title=Module:Mt19937ar&amp;diff=207&amp;oldid=prev</id>
		<title>Pokeylope: Created page with &quot;-- https://github.com/davebollinger/mt19937ar-lua --[[ mt19937ar.lua, a conversion of the Jan 26 2002 version of mt19937ar.c ref:  http://www.math.sci.hiroshima-u.ac.jp/~m-mat...&quot;</title>
		<link rel="alternate" type="text/html" href="https://glolfwiki.sibr.dev/index.php?title=Module:Mt19937ar&amp;diff=207&amp;oldid=prev"/>
		<updated>2021-06-03T21:01:11Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- https://github.com/davebollinger/mt19937ar-lua --[[ mt19937ar.lua, a conversion of the Jan 26 2002 version of mt19937ar.c ref:  http://www.math.sci.hiroshima-u.ac.jp/~m-mat...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- https://github.com/davebollinger/mt19937ar-lua&lt;br /&gt;
--[[&lt;br /&gt;
mt19937ar.lua, a conversion of the Jan 26 2002 version of mt19937ar.c&lt;br /&gt;
ref:  http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html&lt;br /&gt;
Copyright (C) 2016 David Bollinger (davebollinger at gmail dot com)&lt;br /&gt;
for pure Lua 5.1 (tested against 5.1.5) 3/25/2016&lt;br /&gt;
&lt;br /&gt;
Lua-specific differences in this translation:  support for multiple instances, init_by_array is 1-based, methods to get\set state, math library work-alikes&lt;br /&gt;
(granted that much of this is superfluous/redundant with the release of Lua 5.3, but I needed the 5.1 support, multiple instances, etc)&lt;br /&gt;
Bonus:  successfully passes the validation test :D&lt;br /&gt;
&lt;br /&gt;
--example usage (long-form / multiple-instance form):&lt;br /&gt;
mt19937ar = require(&amp;quot;mt19937ar&amp;quot;)&lt;br /&gt;
mt1 = mt19937ar.new()&lt;br /&gt;
mt1:createValidationOutput()&lt;br /&gt;
&lt;br /&gt;
mt2 = mt19937ar.new()&lt;br /&gt;
mt2:init_genrand(1234)&lt;br /&gt;
r = mt:genrand_int32()&lt;br /&gt;
&lt;br /&gt;
mt3 = mt19937ar.new()&lt;br /&gt;
mt3:init_genrand(2345)&lt;br /&gt;
s = mt3:getState() -- save prior to gen&lt;br /&gt;
r = mt3:genrand_real2() -- advance state&lt;br /&gt;
mt3:setState(s) -- restore prior state&lt;br /&gt;
r = mt3:genrand_real2() -- regen from same prior state&lt;br /&gt;
&lt;br /&gt;
--validation usage (short-form / single-instance form)&lt;br /&gt;
require(&amp;quot;mt19937ar&amp;quot;).new():createValidationOutput()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* &lt;br /&gt;
   A C-program for MT19937, with initialization improved 2002/1/26.&lt;br /&gt;
   Coded by Takuji Nishimura and Makoto Matsumoto.&lt;br /&gt;
&lt;br /&gt;
   Before using, initialize the state by using init_genrand(seed)  &lt;br /&gt;
   or init_by_array(init_key, key_length).&lt;br /&gt;
&lt;br /&gt;
   Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,&lt;br /&gt;
   All rights reserved.                          &lt;br /&gt;
&lt;br /&gt;
   Redistribution and use in source and binary forms, with or without&lt;br /&gt;
   modification, are permitted provided that the following conditions&lt;br /&gt;
   are met:&lt;br /&gt;
&lt;br /&gt;
     1. Redistributions of source code must retain the above copyright&lt;br /&gt;
        notice, this list of conditions and the following disclaimer.&lt;br /&gt;
&lt;br /&gt;
     2. Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
        notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
        documentation and/or other materials provided with the distribution.&lt;br /&gt;
&lt;br /&gt;
     3. The names of its contributors may not be used to endorse or promote &lt;br /&gt;
        products derived from this software without specific prior written &lt;br /&gt;
        permission.&lt;br /&gt;
&lt;br /&gt;
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS&lt;br /&gt;
   &amp;quot;AS IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT&lt;br /&gt;
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR&lt;br /&gt;
   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR&lt;br /&gt;
   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,&lt;br /&gt;
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR&lt;br /&gt;
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;br /&gt;
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING&lt;br /&gt;
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS&lt;br /&gt;
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   Any feedback is very welcome.&lt;br /&gt;
   http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html&lt;br /&gt;
   email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)&lt;br /&gt;
*/&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
--------------------------------&lt;br /&gt;
-- BEGIN INTERNAL SUPPORT STUFF&lt;br /&gt;
--------------------------------&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
-- bitwise support for pure Lua 5.1&lt;br /&gt;
-- of &amp;quot;32-bit integers&amp;quot;&lt;br /&gt;
-- (as represented by Lua's double-precision floating point number type)&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
local floor = math.floor&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
-- a 32bitUL * 32bitUL = 64bitUL can overflow the 53-bit precision of a double&lt;br /&gt;
-- (thus potentially corrupting the lower 32-bits)&lt;br /&gt;
-- this &amp;quot;longhand method&amp;quot; 48-bit version ignores the (unneeded) hiword * hiword&lt;br /&gt;
-- portion to avoid overflow of intermediate result prior to truncation to 32-bits&lt;br /&gt;
-- (only used when seeding, not when generating, so performance considerations should be negligible)&lt;br /&gt;
-- @param a number a &amp;quot;32-bit integer&amp;quot;&lt;br /&gt;
-- @param b number a &amp;quot;32-bit integer&amp;quot;&lt;br /&gt;
-- @return number the &amp;quot;32-bit integer&amp;quot; result of multiplication&lt;br /&gt;
local function SAFEMUL32(a,b)&lt;br /&gt;
	local alo = floor(a % 65536)&lt;br /&gt;
	local ahi = floor(a/65536) % 65536&lt;br /&gt;
	local blo = floor(b % 65536)&lt;br /&gt;
	local bhi = floor(b/65536) % 65536&lt;br /&gt;
	local lolo = alo * blo&lt;br /&gt;
	local lohi = alo * bhi&lt;br /&gt;
	local hilo = ahi * blo&lt;br /&gt;
	local llhh = lohi + hilo&lt;br /&gt;
	return floor((llhh*65536+lolo) % 4294967296)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
-- 32-bit bitwise and&lt;br /&gt;
-- @param a number a &amp;quot;32-bit integer&amp;quot;&lt;br /&gt;
-- @param b number a &amp;quot;32-bit integer&amp;quot;&lt;br /&gt;
-- @return number the &amp;quot;32-bit integer&amp;quot; result of the bitwise operation&lt;br /&gt;
local function AND(a, b)&lt;br /&gt;
	local r,p = 0,1&lt;br /&gt;
	for i = 0, 31 do&lt;br /&gt;
		local a1 = a%2&lt;br /&gt;
		local b1 = b%2&lt;br /&gt;
		if ((a1&amp;gt;0) and (b1&amp;gt;0)) then r=r+p end&lt;br /&gt;
		if (a1&amp;gt;0) then a=a-1 end&lt;br /&gt;
		if (b1&amp;gt;0) then b=b-1 end&lt;br /&gt;
		a = a/2&lt;br /&gt;
		b = b/2&lt;br /&gt;
		p = p*2&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
-- 32-bit bitwise or&lt;br /&gt;
-- @param a number a &amp;quot;32-bit integer&amp;quot;&lt;br /&gt;
-- @param b number a &amp;quot;32-bit integer&amp;quot;&lt;br /&gt;
-- @return number the &amp;quot;32-bit integer&amp;quot; result of the bitwise operation&lt;br /&gt;
local function OR(a, b)&lt;br /&gt;
	local r,p = 0,1&lt;br /&gt;
	for i = 0, 31 do&lt;br /&gt;
		local a1 = a%2&lt;br /&gt;
		local b1 = b%2&lt;br /&gt;
		if ((a1&amp;gt;0) or (b1&amp;gt;0)) then r = r + p end&lt;br /&gt;
		if (a1&amp;gt;0) then a=a-1 end&lt;br /&gt;
		if (b1&amp;gt;0) then b=b-1 end&lt;br /&gt;
		a = a/2&lt;br /&gt;
		b = b/2&lt;br /&gt;
		p = p*2&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
-- 32-bit bitwise xor&lt;br /&gt;
-- @param a number a &amp;quot;32-bit integer&amp;quot;&lt;br /&gt;
-- @param b number a &amp;quot;32-bit integer&amp;quot;&lt;br /&gt;
-- @return number the &amp;quot;32-bit integer&amp;quot; result of the bitwise operation&lt;br /&gt;
local function XOR(a, b)&lt;br /&gt;
	local r,p = 0,1&lt;br /&gt;
	for i = 0, 31 do&lt;br /&gt;
		local a1 = a%2&lt;br /&gt;
		local b1 = b%2&lt;br /&gt;
		if (a1~=b1) then r = r + p end&lt;br /&gt;
		if (a1&amp;gt;0) then a=a-1 end&lt;br /&gt;
		if (b1&amp;gt;0) then b=b-1 end&lt;br /&gt;
		a = a/2&lt;br /&gt;
		b = b/2&lt;br /&gt;
		p = p*2&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- various bitwise shifts and masks&lt;br /&gt;
local SHR1 = function(y) return floor(y / 2) end&lt;br /&gt;
local SHR30 = function(y) return floor(y / 1073741824) end&lt;br /&gt;
local SHR11 = function(y)  return floor(y / 2048)  end&lt;br /&gt;
local SHL7 = function(y)  return (y * 128)  end&lt;br /&gt;
local SHL15 = function(y)  return (y * 32768)  end&lt;br /&gt;
local SHR18 = function(y)  return floor(y / 262144)  end&lt;br /&gt;
local BIT0 = function(y) return (y%2) end -- should not be necessary to floor() this result, given its usage exclusively on &amp;quot;ints&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--------------------------------&lt;br /&gt;
-- END INTERNAL SUPPORT STUFF&lt;br /&gt;
-- BEGIN ACTUAL MERSENNE TWISTER&lt;br /&gt;
--------------------------------&lt;br /&gt;
&lt;br /&gt;
local N = 624&lt;br /&gt;
local M = 397&lt;br /&gt;
&lt;br /&gt;
local MATRIX_A = 0x9908B0DF&lt;br /&gt;
local UPPER_MASK = 0x80000000&lt;br /&gt;
local LOWER_MASK = 0x7FFFFFFF&lt;br /&gt;
&lt;br /&gt;
local mt19937ar = {}&lt;br /&gt;
-- there is intentionally no metatable usage on mt19937ar to function as a &amp;quot;class&amp;quot;&lt;br /&gt;
-- everything is in the instance closures created by .new() (the single exposed &amp;quot;class&amp;quot; method) &lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
-- @description creates an instance of the rng&lt;br /&gt;
-- @return table an instance of the rng&lt;br /&gt;
--&lt;br /&gt;
function mt19937ar.new()&lt;br /&gt;
	local instance = {}&lt;br /&gt;
	--&lt;br /&gt;
	-- private members&lt;br /&gt;
	-- @see getState @see setState&lt;br /&gt;
	--&lt;br /&gt;
	local mt = {}&lt;br /&gt;
	local mti = N+1&lt;br /&gt;
	--&lt;br /&gt;
	-- public members&lt;br /&gt;
	--&lt;br /&gt;
&lt;br /&gt;
	---&lt;br /&gt;
	-- @description seed the generator via number&lt;br /&gt;
	-- @param s number representing a 32-bit integer seed value&lt;br /&gt;
	function instance:init_genrand(s)&lt;br /&gt;
		mt[0] = AND(s, 0xFFFFFFFF)&lt;br /&gt;
		for i=1,N-1 do&lt;br /&gt;
			-- mt[i] = 1812433253 * XOR(mt[i-1], SHR30(mt[i-1])) + i -- the literal translation, but nope&lt;br /&gt;
			mt[i] = SAFEMUL32(1812433253, XOR(mt[i-1], SHR30(mt[i-1]))) + i -- yep&lt;br /&gt;
			mt[i] = AND(mt[i], 0xFFFFFFFF)&lt;br /&gt;
		end&lt;br /&gt;
		mti = N&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	---&lt;br /&gt;
	-- @description seed the generator via array&lt;br /&gt;
	-- @param init_key array of integer seeds, @note 1-based as per Lua conventions&lt;br /&gt;
	-- @param key_length number optional length of array to use (if not provided will be assumed to be #init_key)&lt;br /&gt;
	function instance:init_by_array(init_key, key_length)&lt;br /&gt;
		self:init_genrand(19650218);&lt;br /&gt;
		if (not key_length) then key_length = #init_key end&lt;br /&gt;
		local i,j,k = 1,0,(N&amp;gt;key_length and N) or key_length&lt;br /&gt;
		while k&amp;gt;0 do&lt;br /&gt;
			--mt[i] = XOR(mt[i], XOR(mt[i-1], SHR30(mt[i-1])) * 1664525) + init_key[j+1] + j -- the literal translation, but nope&lt;br /&gt;
			mt[i] = XOR(mt[i], SAFEMUL32(XOR(mt[i-1], SHR30(mt[i-1])), 1664525)) + init_key[j+1] + j -- yep&lt;br /&gt;
			mt[i] = AND(mt[i], 0xFFFFFFFF)&lt;br /&gt;
			i,j = i+1,j+1&lt;br /&gt;
			if (i&amp;gt;=N) then mt[0] = mt[N-1]; i=1 end&lt;br /&gt;
			if (j&amp;gt;=key_length) then j=0 end&lt;br /&gt;
			k = k-1&lt;br /&gt;
		end&lt;br /&gt;
		for k = N-1,1,-1 do&lt;br /&gt;
			--mt[i] = XOR(mt[i], XOR(mt[i-1], SHR30(mt[i-1])) * 1566083941) - i -- the literal translation, but nope&lt;br /&gt;
			mt[i] = XOR(mt[i], SAFEMUL32(XOR(mt[i-1], SHR30(mt[i-1])), 1566083941)) - i -- yep&lt;br /&gt;
			mt[i] = AND(mt[i], 0xFFFFFFFF)&lt;br /&gt;
			i = i+1&lt;br /&gt;
			if (i&amp;gt;=N) then mt[0] = mt[N-1]; i=1 end&lt;br /&gt;
		end&lt;br /&gt;
		mt[0] = 0x80000000&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- generates a random number on [0,0xffffffff]-interval&lt;br /&gt;
	function instance:genrand_int32()&lt;br /&gt;
		local y&lt;br /&gt;
		if mti&amp;gt;=N then&lt;br /&gt;
			if mti==N+1 then&lt;br /&gt;
				self:init_genrand(5489)&lt;br /&gt;
			end&lt;br /&gt;
			for kk = 0, N-M-1 do&lt;br /&gt;
				y = OR( AND(mt[kk],UPPER_MASK) , AND(mt[kk+1],LOWER_MASK) )&lt;br /&gt;
				mt[kk] = XOR(mt[kk+M], XOR( SHR1(y), BIT0(y)*MATRIX_A ))&lt;br /&gt;
				kk=kk+1&lt;br /&gt;
			end&lt;br /&gt;
			for kk = N-M, N-2 do&lt;br /&gt;
				y = OR( AND(mt[kk],UPPER_MASK) , AND(mt[kk+1],LOWER_MASK) )&lt;br /&gt;
				mt[kk] = XOR(mt[kk+(M-N)], XOR( SHR1(y), BIT0(y)*MATRIX_A ))&lt;br /&gt;
				kk=kk+1&lt;br /&gt;
			end&lt;br /&gt;
			y = OR( AND(mt[N-1],UPPER_MASK) , AND(mt[0],LOWER_MASK) )&lt;br /&gt;
			mt[N-1] = XOR(mt[M-1], XOR( SHR1(y), BIT0(y)*MATRIX_A ))&lt;br /&gt;
			mti=0&lt;br /&gt;
		end&lt;br /&gt;
		y = mt[mti]&lt;br /&gt;
		mti = mti+1&lt;br /&gt;
		y = XOR(y, SHR11(y))&lt;br /&gt;
		y = XOR(y, AND(SHL7(y), 0x9D2C5680) )&lt;br /&gt;
		y = XOR(y, AND(SHL15(y), 0xEFC60000) )&lt;br /&gt;
		y = XOR(y, SHR18(y))&lt;br /&gt;
		return y&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Floating Point Versions&lt;br /&gt;
&lt;br /&gt;
	--- generates a random number on [0,0x7fffffff]-interval&lt;br /&gt;
	function instance:genrand_int31()&lt;br /&gt;
		return floor(self:genrand_int32() / 2)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- generates a random number on [0,1]-real-interval&lt;br /&gt;
	function instance:genrand_real1()&lt;br /&gt;
		return self:genrand_int32() * (1.0/4294967295.0) -- divided by 2^32-1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- generates a random number on [0,1)-real-interval&lt;br /&gt;
	function instance:genrand_real2()&lt;br /&gt;
		return self:genrand_int32() * (1.0/4294967296.0) -- divided by 2^32&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- generates a random number on (0,1)-real-interval&lt;br /&gt;
	function instance:genrand_real3()&lt;br /&gt;
		return (self:genrand_int32() + 0.5) * (1.0/4294967296.0) -- divided by 2^32 &lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- generates a random number on [0,1) with 53-bit resolution&lt;br /&gt;
	function instance:genrand_res53() &lt;br /&gt;
		local a = floor(self:genrand_int32() / 32)&lt;br /&gt;
		local b = floor(self:genrand_int32() / 64)&lt;br /&gt;
			return (a*67108864.0+b) * (1.0/9007199254740992.0)&lt;br /&gt;
	end&lt;br /&gt;
	--/* These real versions are due to Isaku Wada, 2002/01/09 added */&lt;br /&gt;
&lt;br /&gt;
	--- a math library work-alike for seeding the generator&lt;br /&gt;
	instance.randomseed = instance.init_genrand&lt;br /&gt;
&lt;br /&gt;
	--- a math library work-alike for generating random numbers&lt;br /&gt;
	function instance:random(m,n)&lt;br /&gt;
		if (not m) then&lt;br /&gt;
			-- handle zero-argument form&lt;br /&gt;
			return self:genrand_real2()&lt;br /&gt;
		else&lt;br /&gt;
			if (not n) then&lt;br /&gt;
				-- handle one-argument form&lt;br /&gt;
				return self:genrand_int32() % m + 1&lt;br /&gt;
			else&lt;br /&gt;
				-- handle two-argument form&lt;br /&gt;
				return m + self:genrand_int32() % (n-m+1)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--&lt;br /&gt;
	-- Esoterica&lt;br /&gt;
	--&lt;br /&gt;
&lt;br /&gt;
	---&lt;br /&gt;
	-- @description get a clone of the current state&lt;br /&gt;
	-- @return a table representing the full state, containing mti (number) and mt (table of numbers)&lt;br /&gt;
	function instance:getState()&lt;br /&gt;
		local r = {}&lt;br /&gt;
		r.mti = mti&lt;br /&gt;
		r.mt = {}&lt;br /&gt;
		for i=0,N-1 do&lt;br /&gt;
			r.mt[i] = mt[i]&lt;br /&gt;
		end&lt;br /&gt;
		return r&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	---&lt;br /&gt;
	-- @description set the current state&lt;br /&gt;
	-- @param s a table of the form returned by @see getState, containing mti (number) and mt (table of numbers)&lt;br /&gt;
	function instance:setState(s)&lt;br /&gt;
		if (s==nil) then return end&lt;br /&gt;
		if (type(s.mti)==&amp;quot;number&amp;quot;) then mti = floor(s.mti) end&lt;br /&gt;
		if (type(s.mt)==&amp;quot;table&amp;quot;) then&lt;br /&gt;
			for i = 0,N-1 do&lt;br /&gt;
				if (type(s.mt[i])==&amp;quot;number&amp;quot;) then&lt;br /&gt;
					mt[i] = floor(s.mt[i])&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	---&lt;br /&gt;
	-- this function replicates the test output from the original mt19937ar.c source code&lt;br /&gt;
	-- this output may be comp/diff'd against the original to validate the implementation&lt;br /&gt;
	-- writes a file named &amp;quot;mt19937ar.lua.out&amp;quot; in the current working directory&lt;br /&gt;
	-- reference:&lt;br /&gt;
	-- http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.out&lt;br /&gt;
	--&lt;br /&gt;
	function instance:createValidationOutput()&lt;br /&gt;
		local filename = &amp;quot;mt19937ar.lua.out&amp;quot;&lt;br /&gt;
		local f = io.open(filename,&amp;quot;wb&amp;quot;)&lt;br /&gt;
		self:init_by_array({291,564,837,1110})&lt;br /&gt;
		f:write(&amp;quot;1000 outputs of genrand_int32()\n&amp;quot;)&lt;br /&gt;
		for i=0,999 do&lt;br /&gt;
			f:write( string.format(&amp;quot;%10.0f &amp;quot;, self:genrand_int32()) )&lt;br /&gt;
			if i%5==4 then f:write( &amp;quot;\n&amp;quot; ) end&lt;br /&gt;
		end&lt;br /&gt;
		f:write(&amp;quot;\n1000 outputs of genrand_real2()\n&amp;quot;)&lt;br /&gt;
		for i=0,999 do&lt;br /&gt;
			f:write( string.format(&amp;quot;%10.8f &amp;quot;, self:genrand_real2()) )&lt;br /&gt;
			if i%5==4 then f:write( &amp;quot;\n&amp;quot; ) end&lt;br /&gt;
		end&lt;br /&gt;
		f:close()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--&lt;br /&gt;
&lt;br /&gt;
	return instance&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- END&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
return mt19937ar&lt;/div&gt;</summary>
		<author><name>Pokeylope</name></author>
	</entry>
</feed>