缺失变量

缺失变量

在这段代码中,我创建了三个随机数列表……但由于某种原因,它们只在某些时候出现。

发生了什么?

\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}%
}

(我还添加了缺失的部分%

在此处输入图片描述

相关内容