列表项的随机排列

列表项的随机排列

我正在为单位圆和特殊三角形创建工作表。很容易列出这些角度,然后随机打印其中一个角度,每次打印任意次数。该代码如下。

但这实际上保证了某些角度的重复。如果我想要一个随机排列,使得每个项目都被选择一次,该怎么办?

我在 TeX.StackExchange 上读过一些关于排列的其他帖子,但那里的答案似乎都非常复杂。我希望现在也许有一个更简单的解决方案。:-)

\documentclass{article}

\usepackage{pgf}
\usepackage{pgffor}

\pgfmathdeclarerandomlist{UnitCircleAngles}
 {
  {0}{90}{180}{270}{360}
  {45}{135}{225}{315}
  {30}{60}{120}{150}{210}{240}{300}{330}
 }

\begin{document}

\section*{Unit Circle Diagrams}

Draw a diagram of the angle in standard position for each of the following.

\foreach \x in {1,...,16}
 {\pgfmathrandomitem{\TheAngle}{UnitCircleAngles}%
  \xdef\TheAngle{\TheAngle}%
  \noindent \TheAngle%

  \vspace{0.25cm}%
 }

\end{document}

答案1

一个非常粗糙但简洁的 push/pop 模拟器,使用逗号分隔xstring

\documentclass{article}
\usepackage{tikz,xstring}
\def\myshuffle{}
\def\UnitCircleAngles{{0}{90}{180}{270}{360}{45}{135}{225}{315}%
  {30}{60}{120}{150}{210}{240}{300}{330}}
\pgfmathdeclarerandomlist{UnitCircleAngles}{\UnitCircleAngles}

\begin{document}
% Shuffle list
\foreach\x in{1,...,17}{
  \pgfmathrandomitem{\myang}{UnitCircleAngles}                   % Pick one from that list
  \xdef\myshuffle{\myshuffle\ifnum\x>1,\fi\myang}                % place in the new list
  \StrSubstitute{\UnitCircleAngles}{{\myang}}{}[\sublist]        % Delete that entry
  \global\let\UnitCircleAngles\sublist                           % Update the main list
  \pgfmathdeclarerandomlist{UnitCircleAngles}{\UnitCircleAngles} % Redefine the list
}
\myshuffle
\end{document}

在此处输入图片描述

答案2

Sagemath,现在计算公式,使用该sagetex软件包可以轻松实现这一点。作为计算机代数系统,Sage 内置了许多数学命令。它还可以计算答案。

\documentclass{article}
\usepackage{sagetex}
\begin{document}
\begin{sagesilent}
a=Permutations([0,90,180,270,360,45,135,225,315,30,60,120,150,210,240,300,330]).random_element()
\end{sagesilent}
\noindent A random permutation of a set of your set of $\sage{len(a)}$ angles is:\\
$\sage{a}$.\\\\
Question $1$: What is $\sin(\sage{a[0]}^{\circ})$?\\
Question $2$: What is $\cos(\sage{a[1]}^{\circ})$?\\\\
Answer to Question $1$ is $\sage{sin(a[0]*pi/180)}$.\\
Answer to Question $2$ is $\sage{cos(a[1]*pi/180)}$.\\
\end{document}

输出如下所示: 在此处输入图片描述

关于排列的文档是这里。编辑:如果您感兴趣的话,还有更多详细信息。知道 Sage 可以进行排列,我在网站上搜索了排列,找到了上面链接的文档。它告诉我命令 a 并给出了示例输出,类似于 [2,3,1]。这就是 Python 中所谓的列表,在其他语言中基本上是一个数组。如果我将排列命令输入 Sage,您可以尝试使用 Sage Cell Server这里它会返回一个列表。该列表存储在变量 a 中。1 命令是在sagesilent环境中完成的,因此它在后台。将结果导入 LaTeX 的方法是使用 \sage 表示数字或 \sagestr 表示字符串。命令 \sage{len(a)} 告诉 Sage 确定列表中有多少个元素,由于它是数值数据,因此它排版在美元符号之间。命令 \sage{a} 打印出列表。现在 Python 将 k 个元素的列表称为第 0、1、...(k-1) 个位置。因此 \sage{a[0]} 抓取我的随机排列中的第一个元素,并且 \sage{a1} 抓取第二个元素。最后,我们让 Sage 计算答案,从而将出错的可能性降到最低。这是通过 \sage{sin(a[0]*pi/180)} 完成的,因为 Sage 假设角度以弧度表示。现在 Sage 计算列表中第一个角度的正弦并将其插入到文档中。不需要深入的知识,只需要一些反复出现的基本技能。

相关内容