Module:Choice Explained

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_tableend

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)endreturn p;