Luarandom 导致无限循环

Luarandom 导致无限循环

我正在尝试获取间隔内的唯一随机整数列表luarandom包裹。

以下是根据软件包文档改编的 MWE:

\documentclass{article}
\usepackage{luarandom}
\usepackage{multido}
\begin{document}

\makeRandomNumberList{1}{30}{5}% works
% \makeRandomNumberList{2}{30}{5}% hangs
\multido{\iA=1+1}{5}{\getNumberFromList{\iA}, }

\end{document}

这给出了 1 到 30 之间的五个唯一整数。但我不想 1 出现在我的列表中。如果我将 更改为{1}{2}如注释掉的行中所示,LaTeX 似乎会陷入无限循环。

luarandom 包中的 lua 代码(复制如下)没有记录,所以我无法轻松追踪发生了什么。但似乎可能allFound(R)永远不会返回true

RandomNumbers = {}

function allFound(R)
  local r1 = R[1]
  local i
  for i=2,#R do 
    r1 = r1 and R[i]
    if not r1 then return false end 
  end
  return true
end

function makeRandomNumberList(l,r,n)
  RandomNumbers = {}
  math.randomseed(os.time())
  local R = {}
  local i,j
  for i=1,n do R[i] = false end
  repeat
    local rand = math.random(l,r)
    if not R[rand] then
      R[rand] = true
      RandomNumbers[#RandomNumbers+1] = rand
    end
  until allFound(R)
end

function makeSimpleRandomNumberList(l,r,n)
  RandomNumbers = {}
  math.randomseed(os.time()/3)
  local i
  for i=1,n do RandomNumbers[#RandomNumbers+1] = math.random(l,r) end
end

function getRand(i)
 tex.print(RandomNumbers[i])
end

答案1

该软件包的文档非常稀疏,但它看起来像是一个 Lua 编程错误,我认为预期的定义是

\documentclass{article}
\usepackage{luarandom}
\directlua{
function makeRandomNumberList(l,r,n)
  RandomNumbers = {}
  math.randomseed(os.time())
  local R = {}
  local i,j
  for i=1,n do R[i] = false end
  repeat
    local rand = math.random(l,r)
    if not R[rand+1-l] then
      R[rand+1-l] = true
      RandomNumbers[\string#RandomNumbers+1] = rand
    end
  until allFound(R)
end
}
\usepackage{multido}
\begin{document}

%\makeRandomNumberList{1}{30}{5}% works
\makeRandomNumberList{2}{30}{5}% hangs
\multido{\iA=1+1}{5}{show\iA\getNumberFromList{\iA}, }

\end{document}

相关内容