Modul:Statistikk

Fra Wikipedia, den frie encyklopedi
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