![物理或化学考试类的随机数生成器](https://linux22.com/image/456410/%E7%89%A9%E7%90%86%E6%88%96%E5%8C%96%E5%AD%A6%E8%80%83%E8%AF%95%E7%B1%BB%E7%9A%84%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94%9F%E6%88%90%E5%99%A8.png)
我想创建一个考试课程,例如:
我可以为物理和化学中的换算因子添加数字和单位的随机生成器。具体来说,我希望有一个伪随机生成器代码,可以让我生成以下输出:
$ 3.34\cdot 10^{-5}\dfrac{m}{s}$ to $\dfrac{km}{h}$
(随机变量应该是数字、十的幂和分数中的单位。
我可以添加一个随机化合物生成器(当然,就像单位一样,我原则上不能创建一个随机化合物生成器)。我想要的是创建一个按分子式和/或名称排列的化合物列表。例如:
a) $Fe_{2}O_{3}$ b) Chromium(III) oxide ...
关于如何创建它们,您有什么想法或建议吗?我应该创建或检查哪些包?
编辑后:我是否应该针对每种情况使用 pgf 和 tikz 包创建一个完整的随机生成器列表?
谢谢。
帖子编辑(II):乳胶不是在这个堆栈部分中起作用的方程式吗?
答案1
一个不起眼的开始。
\documentclass[]{article}
\usepackage{tikz}
\begin{document}
% See "94.3.6 Pseudo-random functions" and
% "95.3 Pseudo-Random Numbers" of https://ctan.org/pkg/pgf
\pgfmathsetseed{6}
\begin{itemize}
\item[Between 0 and 1, uniform] \pgfmathparse{rnd}\pgfmathresult
\item[Between $-1$ and 1, uniform] \pgfmathparse{rand}\pgfmathresult
\end{itemize}
\end{document}
答案2
这是一个简单的 pdfTeX 解决方案,使用\pdfuniformdeviate
pdfTeX 中的原语来生成均匀分布的随机整数。
%% Useful TeX macros
\def\nul{\noexpand\nul}
\def\gobble#1{}
\def\repeated#1#2{%
\ifnum#1>0 %
#2%
\expandafter\repeated\expandafter{\the\numexpr #1-1\relax}{#2}%
\fi%
}
% Not necessary
\def\map#1#2{%
\mapA{#1}#2\nul%
}
\def\mapA#1#2{%
\ifx\nul#2%
\let\next=\gobble%
\else%
#1{#2}%
\let\next=\mapA%
\fi%
\next{#1}%
}
\def\commap#1#2{%
\commapA{#1}#2,\nul,%
}
\def\commapA#1#2,{%
\ifx\nul#2%
\let\next=\gobble%
\else%
#1{#2}%
\let\next=\commapA%
\fi%
\next{#1}%
}
%% Macros for randomness
\let\mappingmethod=\commap
\newcount\countA
% \createmap{<name>}{<mapable elements>} -> creates an indexable map of the <mapable elements>
\def\createmap#1#2{%
\countA=0\relax%
\def\createmapA##1{%
\advance\countA by 1\relax%
\expandafter\def\csname m@#1@\the\countA\endcsname{##1}%
}%
\mappingmethod\createmapA{#2}%
\expandafter\edef\csname m@#1@len\endcsname{\the\countA}%
}
% Gets length of map
\def\maplen#1{%
\csname m@#1@len\endcsname%
}
% Gets element from map at index
\def\indexmap#1#2{%
\csname m@#1@#2\endcsname%
}
% Gets random element from map
\def\randindexmap#1{%
\indexmap{#1}{\the\numexpr\pdfuniformdeviate\maplen{#1}+1\relax}
}
% Generates random number in [#1, #2]
\def\irand#1#2{%
\the\numexpr\pdfuniformdeviate\numexpr #2-#1+1\relax+#1\relax%
}
\def\declen{3}
% Generates real random number whose integer part is in [#1, #2], and the decimal length is <= \declen
\def\rrand#1#2{%
\irand{#1}{#2}%
{\edef\declenA{\irand0\declen}
\ifnum\declenA>0 %
.%
\repeated{\numexpr\declenA-1\relax}{\irand09}%
\irand19%
\fi}%
}
%% Creating macros which will actually be used
\createmap{spaceunits}{mm,cm,m,km}
\createmap{timeunits}{ms,s,m,h}
% \randsu -> generate random space unit
\def\randsu{{\rm\randindexmap{spaceunits}}}
% \randtu -> generate random time unit
\def\randtu{{\rm\randindexmap{timeunits}}}
%% Example
$\rrand1{10}\cdot\rrand0{10}\frac\randsu\randtu$
这里发生的事情的概述:
\createmap
接受两个参数:一个名称和逗号分隔的值,并由此创建一个具有指定名称和值的“hasmap”(键是值的索引)。如果您设置
\mappingmethod
为\map
,则可以将值分组,而不是使用逗号分隔值(例如\createmap{example}{{first}{second}{third}}
,如果值本身包含逗号,这将很有用)。\maplen
为您提供地图的大小(值的数量),\indexmap
通过给定的索引(第二个参数)对地图进行索引,\randomindexmap
随机对地图进行索引。\irand
给出指定范围内(含)的随机整数。\rrand
给出一个随机实数,其整数部分在指定范围内(含),小数点后的数字个数由 给出\declen
。
因此,我们创建了两个地图,spaceunits
它们timeunits
具有不同的空间和时间单元,以及宏\randsu
和,\randtu
它们为了方便起见随机索引这些地图(\randsu
给出一个随机的空间单元和\randtu
给出一个随机时间单元)。
您或许可以使用\createmap
和\randomindexmap
来回答您的第二个问题。
答案3
我建议使用 LuaLaTeX 来完成这项任务。您可以用 Lua 编写逻辑来为问题创建“随机”数据,Lua 是一种(在我看来)比 LaTeX 原生提供的任何语言都更平易近人和更完整的语言,然后使用这些随机数据排版您的问题。