我正在尝试获取间隔内的唯一随机整数列表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}