Modul:Statistikk
Moduldokumentasjon
local p = {}
require "mw.ustring"
-- fra https://sv.wikipedia.org/w/index.php?title=Modul:Statistik&oldid=24271991
function p.tilfeldigtrekning(frame)
local res = ""
local verdi = frame.args['verdi']
if (not verdi) then return "Parameterfeil: Obligatorisk parameter 'verdi' mangler!" end
local table verdiliste = mw.text.split(verdi,",",true)
local absoluttfrekvenser = frame.args['absoluttfrekvenser']
local relativfrekvenser = frame.args['relativfrekvenser']
local tilbakelegging = frame.args['tilbakelegging']
if (not tilbakelegging) then tilbakelegging = "" end
local antall = frame.args['antall']
if (antall) then antall = tonumber(antall) else antall = 1 end
local separator = frame.args['separator'] or ""
if (absoluttfrekvenser) and (relativfrekvenser) then return "Parameterfeil: Både absolutte og relative frekvenser er angitt!" end
local kolonner = frame.args['kolonner']
if (kolonner) then antallkolonner = tonumber(kolonner) end
local tabellstil = frame.args['tabellstil']
local fastverdi = frame.args['fastverdi']
local table fast_verdi = {}
if (fastverdi) then fast_verdi = mw.text.split(fastverdi,",",true) end
local table posverdi = {}
for i = 1, #fast_verdi-1, 2 do
posverdi[tonumber(fast_verdi[i])] = tonumber(fast_verdi[i+1])
end
math.randomseed(os.time())
if (relativfrekvenser) then
local table relativfrekvensliste = mw.text.split(relativfrekvenser,",",true)
if (#relativfrekvensliste ~= #verdiliste) then return "Parameterfeil: antall frekvenser (" .. #relativfrekvensliste .. ") er ikke lik antall verdier (" .. #verdiliste .. ")!" end
if (kolonner) then
res = res..'{|'
if (tabellstil) then res = res..tabellstil end
res = res..'\n'
end
for k=1,antall do
if (kolonner) and (k % antallkolonner == 1 or antallkolonner == 1) then
res = res..'|-\n'
end
if (posverdi[k]) then
if (kolonner) then res = res..'|' end
res = res .. verdiliste[posverdi[k]]
if (kolonner) then res = res..'\n' end
if (k < antall) and not (kolonner) then res = res .. separator end
else
tilfeldigtall = math.random()
local ackfrekvens = 0
for i,v in ipairs(relativfrekvensliste) do
ackfrekvens = ackfrekvens + tonumber(v)
if (tilfeldigtall <= ackfrekvens) then
if (kolonner) then res = res..'|' end
res = res .. verdiliste[i]
if (kolonner) then res = res..'\n' end
if (k < antall) and not (kolonner) then res = res .. separator end
break
end
end
end
end
if (kolonner) then res = res.."|}\n" end
return res
end
local table absoluttfrekvensliste = {}
if (absoluttfrekvenser) then
absoluttfrekvensliste = mw.text.split(absoluttfrekvenser,",",true)
if (#absoluttfrekvensliste ~= #verdiliste) then
return "Parameterfeil: antall frekvenser (" .. #absoluttfrekvensliste .. ") er ikke lik antall verdier (" .. #verdiliste .. ")!"
end
else
if (tilbakelegging == "nei") then return "Parameterfeil: Tilbakelegging kan ikke være satt til nei uten at absoluttfrekvenser er angitt!" end
for i,v in ipairs(verdiliste) do
absoluttfrekvensliste[i] = 1
end
end
n = 0
for i,v in ipairs(absoluttfrekvensliste) do n = n + tonumber(v) end
if (antall > n) and (tilbakelegging == "nei") then return "Parameterfeil: antall (" .. antall .. ") større enn antall objekter (" .. n .. ")!" end
if (kolonner) then
res = res..'{|'
if (tabellstil) then res = res..tabellstil end
res = res..'\n'
end
for k=1,antall do
if (posverdi[k]) then
if (tilbakelegging == "nei") then
absoluttfrekvensliste[posverdi[k]] = absoluttfrekvensliste[posverdi[k]] - 1
n = n - 1
end
end
end
for k=1,antall do
if (kolonner) and (k % antallkolonner == 1 or antallkolonner == 1) then
res = res..'|-\n'
end
if (posverdi[k]) then
if (kolonner) then res = res..'|' end
res = res .. verdiliste[posverdi[k]]
if (kolonner) then res = res..'\n' end
if (k < antall) and not (kolonner) then res = res .. separator end
else
tilfeldigtall = math.random(1,n)
local ackfrekvens = 0
for i,v in ipairs(absoluttfrekvensliste) do
absoluttfrekvensliste[i] = tonumber(v)
ackfrekvens = ackfrekvens + tonumber(v)
if (tilfeldigtall <= ackfrekvens) then
if (kolonner) then res = res..'|' end
res = res .. verdiliste[i]
if (kolonner) then res = res..'\n' end
if (k<antall) and not (kolonner) then res = res .. separator end
if (tilbakelegging == "nei") then
absoluttfrekvensliste[i] = absoluttfrekvensliste[i] - 1
n = n - 1
end
break
end
end
end
end
if (kolonner) then res = res.."|}\n" end
return res
end
return p