假设我想设计一份数学考试,将其发布为单个 PDF 文件,例如要求学生解答 $ax^2+bx+c=0$。但我希望每个获得 PDF 文件的学生在打开文件时都能看到一组不同的 $a,b,c$ 值。这可能吗?
例如,从打开文件时获取的随机种子或与接收者计算机相关的某些因素是否可以设置 $a,b,c$ 的值?
此外,我希望种子只生成一次,这样学生第二次重新打开同一个文件时,就可以看到第一次看到的内容。这可能吗?
PDF 的首选/更简单的替代品是什么?
编辑:
我意识到这个方案并不安全。因为学生可以写下任何方便的 $abc$ 并声称这是为他生成的随机数!
因此,这里有一个修改:学生在表单字段中输入他的 ID 号并按下按钮。输出结果为 $a,b,c$。这将是可重现的,每个学生都会得到一组不同的数据,重新加载后将显示相同的数字。
生成的 PDF 是否存在安全问题或存在许多兼容性问题?
答案1
这是使用该软件包的解决方案eforms
。这不是 TeXLive 的一部分,而是 MikTeX 的一部分。如果您使用 TeXLive,可以从 CTAN 获取它并将其安装在本地 TeX 树中。
我认为你需要编写自己的随机数生成器,以便用学生编号作为种子。我使用了以下代码:这里。
这对种子不太敏感,因此您需要调整获取最终数字的方式或使用更合适的随机数生成器。我不太擅长数学,所以这留给读者练习吧……
这会仅有的与 Adobe Reader 配合使用。几乎没有其他 PDF 查看器支持 JavaScript。
要使用它,请输入学生编号(例如 987654)并单击按钮。每次您都会得到相同的三个数字。如果您输入不同的学生编号,您将得到一组不同的三个数字。
\documentclass{article}
\usepackage{parskip}
\usepackage{eforms}
% Pseudo random number generator code taken from
% https://stackoverflow.com/a/47593316/12652399
\begin{defineJS}{\genNums}
function sfc32(a, b, c, d) {
return function() {
a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0;
var t = (a + b) | 0;
a = b ^ b >>> 9;
b = c + (c << 3) | 0;
c = (c << 21 | c >>> 11);
d = d + 1 | 0;
t = t + d | 0;
c = c + t | 0;
return (t >>> 0) / 4294967296;
}
}
var txtId = this.getField("txtId");
var seed = Number(txtId.value) ^ 0xDEADBEEF;
var rand = sfc32(seed, seed, seed, seed);
var txtA = this.getField("txtA");
var txtB = this.getField("txtB");
var txtC = this.getField("txtC");
txtA.value = rand();
txtB.value = rand();
txtC.value = rand();
\end{defineJS}
\begin{document}
Student number: \textField{txtId}{3cm}{11bp}
\pushButton[\CA{Generate Numbers}\A{\JS{\genNums}}]{btnRun}{}{11bp}
a: \textField{txtA}{5cm}{11bp}
b: \textField{txtB}{5cm}{11bp}
c: \textField{txtC}{5cm}{11bp}
\end{document}
答案2
看一下random.tex
哪个可以生成随机数。一个简单的例子:
\documentclass{article}
\input{random}
\begin{document}
\nextrandom % generate a random number as \randomi
\the\randomi % print the random number
\end{document}
阅读手册texdoc random
以了解更多信息。
编辑
我建议你为每个学生运行一次 LaTeX 文件。然后他们将获得一个包含唯一随机数的 PDF 文件。15 名学生生成 15 个 PDF 文件。你需要记录你向哪些学生发送了他们唯一的 PDF 文件。
答案3
我写了多封信,包括根据收信人而定的推论。为此,我使用一封信,并通过数据工具包。如果你有 100 名学生,那么你可能需要的可能不是 100 组不同的问题,而是 50 组不同的问题。