如何随机组合不重复?

时间:2014-01-10 18:06:15

标签: php random

我正在制作Facemash-Alike Script。它的脚本显示两张图片,用户可以选择哪张图片更适合他。

我想创建一个小改进,不会向用户显示他已投票的两张图片的相同组合

我试图以两种方式做到这一点。但任何这种方式对用户来说都不够好或不舒服。

第一个 - 两张图片的选择是随机的。投票后,在数据库中,使用此特定组合和投票值创建新记录。如果两张图片的组合已作为记录存在于数据库中,则页面显示历史投票,并在几秒钟后刷新页面,进行另一种随机组合。

第二个 - 在图片名称添加到数据库的那一刻,脚本会创建所有可能的组合作为数据库中的记录。这是好方法,因为脚本从数据库中提取一个不包含任何结果的随机记录,并在投票后保存一个值。所以没有办法重复。这种方式的主要问题是在添加新图片的那一刻。数据库在开始变得巨大,并在开始时永远创造所有可能的组合。

因此,我正在寻找另一种解决方案。我希望听到一些可能有助于找到我的小建议。

1 个答案:

答案 0 :(得分:0)

您的第一种方法可以更好地扩展,您只是想避免显示历史投票。无论如何,您需要保留投票历史记录,因此请将该历史记录用作过滤器。在SELECT语句中,用于获取历史表上的随机面,左连接以使用连接作为过滤器。

示例:

SELECT faces.uid f_uid, votes.uid v_uid FROM faces 
LEFT JOIN votes ON votes.user_id=# AND faces.uid=votes.face_id1 AND            
faces.uid=votes.face_id2 
WHERE v_uid IS NULL
ORDER BY RAND() LIMIT 2

这将确保他们永远不会两次看到同一张脸。用户投票的面孔越多,速度就越慢。在他们完成数百票之前,它不会明显变慢。

也就是说,您可以将LIMIT更改为20并缓存(即在会话中)。然后你准备好接下来的10对(20/2 = 10)。这是1&的组合。 2。