对于大型数学课程的教学,编写一些内置随机化的问题是有帮助的,因此并非所有学生都能得到完全相同的问题。我的解决方案是编写一个简短的Python脚本来生成一些问题 - 除了数字的微小变化外,它们是相同的。结果可能是给出测验的A / B / C / D类,并自动给我解决方案集A / B / C / D进行快速评分。
我想稍微规范一下,允许其他人使用基本的 Python技能来创建随机测验。另外,更好地组织我自己的工作。我的第一个想法是创建一个带有Question类的模块,该类具有初始化方法,用于渲染(生成LaTeX代码以包含在测验文档中),用于评估给定的响应/答案以及各种其他属性。
但是,问题类的不同实例(不同的随机问题)会有不同的方法。例如,一个问题可能会随机生成两个三位数字x,y,并将问题呈现为“查找(x,y)的GCD”。初始化时,问题也会计算答案,并在评估方法中引用它。另一个问题可能会随机生成一个三位数的数字p,并将问题呈现为“Is p prime?”。
我想到了一些解决方案:
将代码放入字符串属性中,并通过exec / eval调用它。这很糟糕。
每次写一个新问题时都会覆盖各种方法。当我对此进行调查时,我学会了“猴子修补”一词,这似乎也很糟糕。
使用问题元类!然后,我猜每个随机化的问题最终都会成为一个班级。
我猜解决方案3是正确的,所以我必须学习元类。但是,这将是一个有点伤心过。我真的希望初学者程序员可以使用它来编写随机问题。我不希望初学者必须为每个问题申报一个班级。
其他想法?当谈到面向对象的编程方面时,我自己的技能是初学者。
我希望以后能够轻松引用问题,例如用于制作考试或解决方案表。例如,我想将一个问题列表传递给一个函数,使用单个命令,如“make_exam([q1,q2,q3],randomize = True)”,其中q1,q2,q3是三个问题。该命令将返回用于q1,q2,q3的问题文本的考试的LaTeX代码,适当地随机化每一个。我也可以打开/关闭解决方案表等。为此,我认为我需要问题对象来提供各种方法。
答案 0 :(得分:0)
会有很多问题,每个问题中的一些参数会随机化。我假设没有选择问题的随机化,只有他们的参数(虽然这将以相同的方式解决)。
所以,你可以为每个问题设一个课程:
class QuestionTemplate1():
def __init__(self):
self.x = random.randint(100, 1000)
self.y = random.randint(100, 1000)
def get_question(self):
return "Find the GCD of (%d, %d)" % (self.x, self.y)
要创建问题的变体,只需创建一个实例。它们将是随机的,它们将是不同的:
quesition1_a = QuestionTemplate1()
quesition1_b = QuestionTemplate1()
您将拥有所有问题模板[QuestionTemplate1, QuestionTemplate2, QuestionTemplate3,...]
的列表,并为每个模板创建4个问题。
唯一剩下的就是可重复性。你以后可以不能重复相同的随机值吗?是。
在脚本开头设置种子。
random.seed(3543626)
questions_a = [Q() for Q in all_templates]
questions_b = [Q() for Q in all_templates]
questions_c = [Q() for Q in all_templates]
questions_d = [Q() for Q in all_templates]
如果使用相同的种子再次运行相同的代码,您将获得相同的随机参数。我可能会在开头随机化种子并用问题打印出来。然后,如果我愿意的话,我可以重新创建相同的问题。
就是这样。没有eval
,没有exec
,没有monkeypatching,没有元类。甚至不是超级班。