物理或化学考试类的随机数生成器

物理或化学考试类的随机数生成器

我想创建一个考试课程,例如:

  1. 我可以为物理和化学中的换算因子添加数字和单位的随机生成器。具体来说,我希望有一个伪随机生成器代码,可以让我生成以下输出:

    $ 3.34\cdot 10^{-5}\dfrac{m}{s}$ to $\dfrac{km}{h}$ 
    

    (随机变量应该是数字、十的幂和分数中的单位。

  2. 我可以添加一个随机化合物生成器(当然,就像单位一样,我原则上不能创建一个随机化合物生成器)。我想要的是创建一个按分子式和/或名称排列的化合物列表。例如:

    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}

在此处输入图片描述 在此处输入图片描述 https://ctan.org/pkg/pgf

答案2

这是一个简单的 pdfTeX 解决方案,使用\pdfuniformdeviatepdfTeX 中的原语来生成均匀分布的随机整数。

%% 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 原生提供的任何语言都更平易近人和更完整的语言,然后使用这些随机数据排版您的问题。

相关内容