![如何随机化宏的顺序?](https://linux22.com/image/376265/%E5%A6%82%E4%BD%95%E9%9A%8F%E6%9C%BA%E5%8C%96%E5%AE%8F%E7%9A%84%E9%A1%BA%E5%BA%8F%EF%BC%9F.png)
我正在设计一份问卷。我想在这个设计中特别做两件事。我在一个问题中询问这两件事,因为我相信它们是相关的:
首先,我希望问卷的项目顺序是随机的。我天真地在 WME 中将这部分称为 \randomize(实际上它不起作用)。
其次,我想从我的名称库中为整个问卷使用不同的名称。我不知道从哪里开始将其写入代码。
到目前为止,我看过的任何随机化代码似乎都不能满足我的需要。其中一个更突出的原因是,我希望拥有最大的灵活性,能够随心所欲地添加句子(和名字)。
任何帮助都将不胜感激 – 提前致谢。
\documentclass{article}
\newcommand{\NAMEi}{Sally}
\newcommand{\NAMEii}{Harry}
\newcommand{\NAMEiii}{Anne}
\newcommand{\NAMEiv}{Rob}
\newcommand{\SENTi}{When did \NAMEii \ meet \NAMEi ?}
\newcommand{\SENTii}{What did \NAMEiii \ call \NAMEi ?}
\newcommand{\SENTiii}{Does \NAMEiv \ like haning out with \NAMEi ?}
\begin{document}
\randomize{
\SENTi,\SENTii,\SENTiii
}
\end{document}
答案1
根据手册,随机种子(参见\pgfmathsetseed
)默认为时间*年(尽管\time*\year
对于来说太大了\pgfmathparse
)。这意味着种子每分钟最多会改变一次。
\documentclass{article}
\usepackage{pgfmath}
\newcommand{\NAMEi}{Sally}
\newcommand{\NAMEii}{Harry}
\newcommand{\NAMEiii}{Anne}
\newcommand{\NAMEiv}{Rob}
\newcommand{\SENTi}{When did \NAMEii \ meet \NAMEi ?}
\newcommand{\SENTii}{What did \NAMEiii \ call \NAMEi ?}
\newcommand{\SENTiii}{Does \NAMEiv \ like hanging out with \NAMEi ?}
\makeatletter
\newcommand{\randomize}[2]% #1=text part of csname, #2=number in list
{\bgroup% use local registers & definitions
\count1=1
\loop\ifnum\count1<#2
\pgfmathparse{int(random(\the\count1,#2))}%
\count2=\pgfmathresult\relax
\expandafter\let\expandafter\tempa\csname #1\@roman\count1\endcsname
\expandafter\let\expandafter\tempb\csname #1\@roman\count2\endcsname
\global\expandafter\let\csname #1\@roman\count1\endcsname=\tempb
\global\expandafter\let\csname #1\@roman\count2\endcsname=\tempa
\advance\count1 by 1
\repeat
\egroup}%
\makeatother
%\AtBeginDocument{\pgfmathsetseed{\time}}% doesn't seem to change
\begin{document}
\randomize{SENT}{3}
\SENTi
\SENTii
\SENTiii
\end{document}