在PHP中更改RAND()函数的种子?

时间:2017-02-11 18:51:22

标签: php mysql

我通过PHP脚本访问了我的数据库表,有时会得到连续的重复结果。

我运行了这个查询:

$query ="SELECT Question,Answer1,Answer2 FROM MyTable ORDER BY RAND(UNIX_TIMESTAMP(NOW())) LIMIT 1";

在此查询之前,我尝试使用ORDER BY RAND(),但它给了我很多连续的重复结果,这就是我决定使用ORDER BY RAND(UNIX_TIMESTAMP(NOW()))的原因。 但是最后一个仍然给我连续的重复结果(但更少)。

我打算写一个例子来解释当我说“连续重复结果”时我的意思

我表中有100行的图片:ROW1,ROW2,ROW3,ROw4,ROW5 ...... 好吧,当我连续5次调用我的脚本PHP时,得到5个结果:             - ROW2,ROW20,ROW20,ROW50,ROW66

我不想连续两次同一行。 我想要它的例子: - ROW2,ROW20,ROW50,ROW66,ROW20

我只是想以一些简单的方式解决它。

2 个答案:

答案 0 :(得分:0)

https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_rand

  

RAND()并不是一个完美的随机发生器。这是一种快速的方式   根据需要生成可随机移动的随机数   相同MySQL版本的平台。

如果您想要5个结果,为什么不将限制更改为5?这将确保没有重复

另一个选项是读取所有数据,然后在php中使用shuffle? http://php.net/manual/en/function.shuffle.php

或选择最大值并使用从PHP生成的随机数

http://php.net/manual/en/function.mt-rand.php

答案 1 :(得分:0)

仅通过重新定义查询就无法实现您需要更改PHP脚本的逻辑。

如果你想要PHP脚本(和查询)每次执行只返回一行,并且需要保证PHP scrips的重复执行产生不同的行,那么你需要将以前的结果存储在某处,并在查询的WHERE条件中使用先前的结果。

所以你的PHP脚本就像(伪代码):

$previousId = ...; // Load the ID of the row fetched by the previous execution

$query = "SELECT Question,Answer1,Answer2 
      FROM MyTable 
      WHERE id <> ?
      ORDER BY RAND(UNIX_TIMESTAMP(NOW())) 
      LIMIT 1";

// Execute $query, using the $previousId bound parameter value

$newId = ...; // get the ID of the fetched row.

// Save $newId for the next execution. 

您可以使用各种存储来保存/加载已获取行的ID。最简单的可能是在同一个数据库中使用一个包含单行的特殊表来实现此目的。

请注意,如果多次并行调用PHP脚本,则仍然会重复连续行。不确定在你的情况下是否重要。 如果是,您可以使用 locks 数据库事务来解决此问题。