在这段代码中,我创建了三个随机数列表……但由于某种原因,它们只在某些时候出现。
发生了什么?
\documentclass{article}
\usepackage{pgf}
\usepackage{pgffor}
\pagestyle{empty}
\pgfmathsetseed{\number\pdfrandomseed}
\newcommand{\InitVariablesGCF}
{%
\pgfmathdeclarerandomlist{ListA}{{1}{3}{5}{7}{11}}
\pgfmathdeclarerandomlist{ListB}{{10}{20}{40}{60}{80}{90}}
\pgfmathdeclarerandomlist{ListC}{{000}{111}{222}{333}{444}{555}{666}}
\pgfmathrandomitem{\RandomA}{ListA}
\pgfmathrandomitem{\RandomB}{ListB}
\pgfmathrandomitem{\RandomC}{ListC}
}
\newcommand{\ShowMeThree}
{%
\InitVariablesGCF
\RandomA , \RandomB , \RandomC
\vspace{1cm}
}
\newcommand{\ManyShowMeThrees}[1]
{\foreach \x in {1,...,#1} {\ShowMeThree}}
\begin{document}
\ManyShowMeThrees{50}
\end{document}
答案1
如果你添加\show
一个
\newcommand{\ShowMeThree}
{%
\InitVariablesGCF
\show\RandomA
\RandomA , \RandomB , \RandomC
\vspace{1cm}
}
然后你很快就会发现问题
> \RandomA=macro:
->\csname pgfmath@randomlist@ListA@\pgfmath@randomtemp \endcsname .
因此,您的命令\RandomA
被定义为访问项目\pgfmath@randomtemp
,但是在使用此命令之前,您访问了另一个随机项目,因此\pgfmath@randomtemp
最终结果始终是上次调用的值。
如果在下一次计算之前保存每个值,效果会更好
\newcommand{\InitVariablesGCF}
{%
\pgfmathdeclarerandomlist{ListA}{{1}{3}{5}{7}{11}}%
\pgfmathdeclarerandomlist{ListB}{{10}{20}{40}{60}{80}{90}}%
\pgfmathdeclarerandomlist{ListC}{{000}{111}{222}{333}{444}{555}{666}}%
\pgfmathrandomitem{\RandomA}{ListA}\edef\RandomA{\RandomA}%
\pgfmathrandomitem{\RandomB}{ListB}\edef\RandomB{\RandomB}%
\pgfmathrandomitem{\RandomC}{ListC}\edef\RandomC{\RandomC}%
}
(我还添加了缺失的部分%
)