Modul:Statistikk
Hopp til navigering
Hopp til søk
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