如何随机化宏的顺序?

如何随机化宏的顺序?

我正在设计一份问卷。我想在这个设计中特别做两件事。我在一个问题中询问这两件事,因为我相信它们是相关的:

首先,我希望问卷的项目顺序是随机的。我天真地在 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}

相关内容