【问题标题】:How can I generate unique random numbers in PHP?如何在 PHP 中生成唯一的随机数?
【发布时间】:2009-03-23 16:32:49
【问题描述】:

我正在开发一个 MCQ 模块,我需要从我的数据库中获取随机问题。问题是我似乎得到了重复。

【问题讨论】:

  • 为编辑竞争条件道歉,RichB
  • @ryeguy:我回滚了,因为我认为我有更好的编辑。随意添加到我的。
  • 您的问题是否经常变化,还是大多是静态的?
  • @Greg — 好吧,如果这有任何迹象…… ;-)
  • 看起来您的问题是数据库问题,而不是 PHP 问题,具体取决于您要如何执行,请告诉我们您使用的是什么数据库。

标签: php prng


【解决方案1】:

如果您从数据库中获取它们,请使用 SQL 来完成您的工作。例如随机抽取 20 个问题(不重复):

SELECT * FROM questions ORDER BY RAND() LIMIT 20

【讨论】:

    【解决方案2】:

    听起来您想随机排列问题,而不是随机访问它们。所以你的算法应该是这样的。

    1. 获取要显示的所有问题(或问题键)。
    2. 随机播放
    3. 按打乱顺序检索/显示在其中

    洗牌结帐:Fisher-Yates shuffle algorithm

    【讨论】:

      【解决方案3】:

      如果您使用的是 MySql,并且您的数据量较小,您可以使用 ORDER BY RAND()

      【讨论】:

      • 其他 RDBMS 有类似的语法。例如,我相信您可以在 MSSQL 中使用“ORDER BY NEWID()”,在 Oracle 中使用“ORDER BY DBMS_CRYPTO.randominteger”。
      【解决方案4】:

      Do stateless random number generators exist?

      任何伪随机数序列最终都会重复。你如何获得你的伪随机数?

      【讨论】:

        【解决方案5】:

        如果没有更多信息,我可以建议一个基本的解决方案。 (但请用更多信息更新您的问题)

        我猜你有用户,因为这样你就可以将用户已经得到的问题保存到一个表中(无论是否是临时的)。

        如果您没有用户,您可以使用SESSION_ID 作为该用户的用户标识符。

        所以当你第一次获取一个问题并且用户回答它时,它会保存你需要保存的信息,然后将用户的 ID 和问题的 ID 保存到一个表中。

        在获取下一个问题时,您会检查用户是否在此新表中具有该问题 ID。

        【讨论】:

          【解决方案6】:

          如果您有大量的行,您可以在表中添加一列,该列存储 0 到 1 之间的数字,然后通过查询获取:

          SELECT * FROM `mytable` WHERE `randcolumn` > RAND() LIMIT 20
          

          这意味着您的数据库不必随机排列整个表以仅提供 20 行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-06-05
            • 2011-06-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多