从随机性中删除重复和聚类相似性

时间:2014-05-25 15:01:14

标签: python random

我正在尝试为数学测验网站生成动态问题。

这是我所拥有的代码的一个人为的例子:

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()方法,如果我到达任何地方,我会更新。

我不一定在寻找代码,只是重新保证我正在寻找去除重复和相似性聚类的正确途径。

2 个答案:

答案 0 :(得分:1)

标准库(在大多数语言中)是一个很差的随机来源 对于上面使用的OS函数调用也是如此 我想你可以花费更多的CPU周期,所以我建议使用一些加密哈希函数或块/流密码。
例如,DES或SHA 当然你应该使用这样的标准实现 - 所有语言都有很多 给它一些字符串作为输入,例如(当前时间||机器IP),无论如何 并且 - 中提琴 - 你得到了你的结果 不要忘记在小范围内(例如[1-10])重复是不可避免的(例如,在10次试验中一次)。或者我说错了,这就是你所有的问题所在?

答案 1 :(得分:1)

我会考虑使用random.sample

  

返回从总体序列中选择的k长度的唯一元素列表。用于无需替换的随机抽样。

所以,说你有10个问题,你需要20个唯一数字:

random.sample(range(0,100),20)