Module:Choice

local p = {}; local cfg = {}

-- -- Configuration --

-- Set this to true if your wiki has a traffic rate of less than one edit every two minutes or so. -- This will prevent the same "random" number being generated many times in a row until a new edit is made -- to the wiki. This setting is only relevant if the |same= parameter is set. cfg.lowTraffic = false

-- If cfg.lowTraffic is set to true, and the |same= parameter is set, this value is used for the refresh rate of the random seed. -- This is the number of seconds until the seed is changed. Getting this right is tricky. If you set it too high, the same number -- will be returned many times in a row. If you set it too low, you may get different random numbers appearing on the same page, -- particularly for pages that take many seconds to process. cfg.seedRefreshRate = 60

local function deepargs(args) local nice_args_table = {} for k, v in pairs(args) do		if v and v ~= '' then nice_args_table[k] = v		end end return nice_args_table end

p._choice = function( args ) args = deepargs(args) local res = {}; local n;   local lim = tonumber(args[1]) local separator = args[2] table.remove(args,1); table.remove(args,1); for i = 1,lim,1 do       n = math.random( #args ); table.insert(res,args[n]); table.remove(args,n); end return table.concat(res,separator); end

p.choice = function( frame )    --Add a function to "p". if not cfg.lowTraffic then -- Make the seed as random as possible without using anything time-based. This means that the same random number -- will be generated for the same input from the same page - necessary behaviour for some wikicode templates that -- assume bad pseudo-random-number generation. local stats = mw.site.stats local views = stats.views or 0 -- This is not always available, so we need a backup. local seed = views + stats.pages + stats.articles + stats.files + stats.edits + stats.users + stats.activeUsers + stats.admins -- Make this as random as possible without using os.time or os.clock math.randomseed(seed) else -- Make the random seed change every n seconds, where n is set by cfg.seedRefreshRate. -- This is useful for low-traffic wikis where new edits may not happen very often. math.randomseed(math.floor(os.time / cfg.seedRefreshRate)) end local args = frame:getParent.args; return p._choice(args) end return p;