probsoln 包中涉及随机值的解决方案

probsoln 包中涉及随机值的解决方案

过去几年,我构建了大量数学问题,这些问题存储在各种外部文件中。我通过 probsoln 包访问它们进行测验。

我通常使用相当多的随机生成的值来构造问题。当我尝试使用“第二遍”建议(第一遍生成测验,第二遍生成答案)来获取解决方案时,问题就出现了。

这是一个非常简短的 MWE。

\documentclass{article}
\usepackage{probsoln}

\newcounter{firstNum}
\newcounter{secondNum}
\newcounter{answerNum}

\begin{document}
  \hideanswers
  \loadallproblems{MWEQuestions}

  Quiz:
  \begin{enumerate}
    \foreachproblem{%
        \item \thisproblem
    }
  \end{enumerate}

  \medskip  

  Answer Key:
  \showanswers
  \begin{enumerate}
    \foreachproblem{%
        \item \thisproblem
    }
  \end{enumerate}
\end{document}

问题存储在外部文件中,格式如下:

\newproblem{question1}{%
  \random{firstNum}{1}{5}
  \random{secondNum}{6}{10}
  \defcounter{answerNum}{\thefirstNum+\thesecondNum}

  \(\thefirstNum + \thesecondNum=\)
}{%
  \thefirstNum+\thesecondNum = \theanswerNum
}

运行时,输出如下所示:

测验:

  1. 2 + 9 =

答案:

  1. 4 + 10 =

    解决方案:4 + 10 = 14

显然,第二次迭代已经重新随机化了计数器值。我需要某种方法来防止所选值被覆盖,以便在生成解决方案时可以访问它们。

另一个(可能的)问题是,我的大多数问题都重复使用相同的计数器。因此,问题 2 的定义也会为计数器分配随机值。因此,这不仅仅是为了防止解决方案覆盖计数器值,而且是为了防止下一个问题。

谢谢你提供的所有帮助!

[编辑]

我可能找到了解决方案。它适用于我的 MWE,但在发布之前,我想在稍微更强大的设置中测试它。

答案1

以下代码似乎可行,至少对于简单情况而言。第一个代码块是测验本身。它打开一个写入流并从外部文件加载问题。第二个代码块是包含问题的文件,这是实际写入和读取解决方案的地方。

\documentclass{article}

\usepackage{probsoln}

\newwrite\answerfile %Going to store current values in an external file

%Counters to hold randomly generated values for the math questions
\newcounter{firstNum}
\newcounter{secondNum}
\newcounter{answerNum}


\begin{document}
    \immediate\openout\answerfile=MWEAnswers.tex %Write to the files immediately
    \loadallproblems{MWEQuestions}               %Load all problems from external file

%Start typesetting the quiz questions
Quiz:
\begin{enumerate}
    \foreachproblem{%                            %Iterates through the loaded problems
        \item \thisproblem                       %Typesets the current problem
    }
\end{enumerate}
\immediate\closeout\answerfile                   %Done writing to the answer file
\medskip

\immediate\openin\answerfile=MWEAnswers.tex      %Now we want to read from the answer file
\showanswers                                     %Boolean to allow typesetting the answers

% Start Answer Key
Answer Key:
\begin{enumerate}
    \foreachproblem{                            %Again, iterate through the loaded problems
        \item \thisproblem
    }
\end{enumerate}
\end{document}

这是问题文件的代码。请注意,为了确保多个问题不会引起问题,问题包含两个单独问题的定义。就代码而言,它们是相同的(除了一个是加法问题,另一个是减法问题)。

\newproblem{question1}{                                  %Define Question 1
    \random{firstNum}{1}{5}                              %Randomly generate values
    \random{secondNum}{6}{10}
    \defcounter{answerNum}{\thefirstNum+\thesecondNum}   %Calculate answer

\begin{onlyproblem}                                      %This code only runs if the answers
                                                         %are NOT being typeset
    \(\thefirstNum + \thesecondNum=\)                    %Typeset the question for the quiz

                                                        %Write question to external answer file
    \immediate\write\answerfile{\thefirstNum+\thesecondNum=\theanswerNum}
\end{onlyproblem}

}{                                                      %This reads in the solution.
    \read\answerfile to \fileline
    $\fileline$
}

%%% Second Question--Code Identical to the First
\newproblem{question2}{%                                % Define Question 2
    \random{firstNum}{1}{5}
    \random{secondNum}{6}{10}
    \defcounter{answerNum}{\thefirstNum-\thesecondNum}

\begin{onlyproblem}
    \(\thefirstNum - \thesecondNum=\) % Print the question
        
    \immediate\write\answerfile{\thefirstNum-\thesecondNum=\theanswerNum}
\end{onlyproblem}

}{%
    \read\answerfile to \fileline
    $\fileline$
}

此代码的输出为

代码输出的屏幕截图

相关内容