我正在尝试为数学测验网站生成动态问题。
这是我所拥有的代码的一个人为的例子:
from random import randint
def get_simple_addition_question():
question_text = "What is %s + %s?"
question_args = (randint(2,10), randint(2,10))
return question_text % question_args
当我从这个动态问题生成器生成列表时,我有时会看到重复的问题或类似问题的分组。我知道由于randonimity的性质,这是预期的,但我正在寻找一种方法来阻止它。
动态问题定义存储在数据库中,可以通过管理界面进行更新。因此,我正在为动态问题的模型添加验证器,以便不接受不能用于生成足够唯一列表的问题。
确保相同问题永远不会连续的最佳方法是什么?如何在保持看似随机的问题生成的同时防止对类似问题进行分组?
目前正在调查difflib,特别是SequenceMatcher的.ratio()方法,如果我到达任何地方,我会更新。
我不一定在寻找代码,只是重新保证我正在寻找去除重复和相似性聚类的正确途径。
答案 0 :(得分:1)
标准库(在大多数语言中)是一个很差的随机来源
对于上面使用的OS函数调用也是如此
我想你可以花费更多的CPU周期,所以我建议使用一些加密哈希函数或块/流密码。
例如,DES或SHA
当然你应该使用这样的标准实现 - 所有语言都有很多
给它一些字符串作为输入,例如(当前时间||机器IP),无论如何
并且 - 中提琴 - 你得到了你的结果
不要忘记在小范围内(例如[1-10])重复是不可避免的(例如,在10次试验中一次)。或者我说错了,这就是你所有的问题所在?
答案 1 :(得分:1)
我会考虑使用random.sample:
返回从总体序列中选择的k长度的唯一元素列表。用于无需替换的随机抽样。
所以,说你有10个问题,你需要20个唯一数字:
random.sample(range(0,100),20)