0

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

4

6 回答 6

6

听起来你想改变问题,而不是随机访问它们。所以你的算法会是这样的。

  1. 获取要显示的所有问题(或问题键)。
  2. 洗牌
  3. 以打乱的顺序检索/显示它们

洗牌结帐:Fisher-Yates shuffle algorithm

于 2009-03-23T16:36:53.830 回答
6

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

SELECT * FROM questions ORDER BY RAND() LIMIT 20
于 2009-03-23T16:53:19.207 回答
1

如果您使用的是 MySql 并且您有合理的少量数据,则可以使用 ORDER BY RAND()

于 2009-03-23T16:44:47.837 回答
0

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

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

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

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

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

于 2009-03-23T16:35:49.653 回答
0

请参阅是否存在无状态随机数生成器?

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

于 2009-03-23T16:45:49.240 回答
0

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

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

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

于 2009-03-23T19:27:00.413 回答