【问题标题】:random questions from sql server来自 sql server 的随机问题
【发布时间】:2010-07-22 20:11:48
【问题描述】:

我正在开发一个调查应用程序。我有一个 sql server 数据库,最多可容纳 3000 个调查问题。 我为一组 10 个问题调用数据库。我必须确保在尽可能长的时间内没有一个问题被重复。 我可以在这里采取的最佳方法是什么?编写自定义随机化算法或 SQL server 提供一些功能。

【问题讨论】:

  • 为了确保没有一个问题在尽可能长的时间内重复出现,假设有 3000 个问题,最好在再次显示问题之前有 2999 个问题的间隙。如果你按照这个逻辑得出结论,你很快就会意识到问题第一次是随机的,但之后会以相同的顺序再次循环,这可能不是你说“随机”时的意思。因此,必须削弱这些要求中的一项(或两项)。是哪个?
  • 马克,是的,第一次通过我会有独特的 3000 个问题,但是当我重复循环时,我不需要相同的顺序,我需要将它们打乱和随机化。

标签: sql-server random


【解决方案1】:

您能否简单地跟踪检索到的最后一个问题 ID。然后总是用比前一个更高的 id 检索下一个问题。如果没有返回,则取第一个/最低的。

它不会很好地扩展,但听起来你不需要扩展。

【讨论】:

    【解决方案2】:
    SELECT question_id
    FROM questions 
    ORDER BY NEWID()
    

    以随机顺序为您提供所有问题 ID。存储列表,然后按照自己的方式进行操作。

    没有办法在不存储订单的情况下确保重复之间的最长时间。你可以把它放在同一张桌子上的另一列...

    编辑:对 Jacques 先生的想法的一种变体:

    一个名为 random 的列怎么样?像这样洗牌:

    update questions set random = (
        SELECT question_id
        FROM questions 
        ORDER BY NEWID()
    )
    

    然后像这样得到每个新问题:

    select * where random = 'prev_question_id';
    

    然后你可以每隔一段时间洗一下顺序,也许是每晚。

    【讨论】:

    • 根据 OP,这并不能确保问题不会在尽可能长的时间内重复。
    • 道歉;我提交得太快了——希望现在更有意义
    【解决方案3】:

    实际上,获得一个随机集合只是问题的一半。您真正想要的是一个新的随机集,其中包含以前未选择的条目。

    这是 Jeff Atwood 的一篇文章,其中谈到了可能对您有所帮助的“洗牌”:Shuffling 和后续文章 The Danger of Naïveté

    【讨论】:

      【解决方案4】:

      您可以根据问题本身的随机生成器和频率计数器的组合来选择问题。

      如果您总是需要 10 个问题,请从使用频率最低的一组问题开始,然后应用随机数生成器从该组中进行选择。增加这些问题的频率。这些最近提出的问题比池中的其他问题具有更高的频率数,因此在下一轮中将忽略这些问题。

      该过程将继续,直到您将所有问题都升级到下一个频率,并且整个池再次可用。

      【讨论】:

        【解决方案5】:

        这种听起来像家庭作业。如果重点真的是确保问题在绝对必要之前从不重复,那么我建议添加一列或另一个带有 TimesUsed 字段的表。

        首先,您将拥有所有 3000 条 TimesUsed 为 0 的记录。抓住前 10 条

        SELECT TOP 10 QUESTIONS WHERE TimesUsed = (SELECT MIN(TimesUsed) FROM Questions)

        并更新表格,将这些问题的 TimesUsed 设置为 TimesUsed +1。

        这是一种简单的方法,如果您没有可被 10 整除的问题数量,您需要考虑一下,但我将把它留给您 :)

        当然,如果您不执着于在所有内容都用完之前从不重复一个,那么这些都不重要。

        【讨论】:

          猜你喜欢
          • 2017-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-04
          相关资源
          最近更新 更多