8

SQLite 是否支持RANDOM()像 MySQL 一样为函数播种RAND()

$query = "SELECT * FROM table ORDER BY RAND(" . date('Ymd') . ") LIMIT 1;";

从 MySQL 手册中关于RAND(N)

如果指定了常量整数参数 N,则将其用作种子值,从而生成可重复的列值序列。在下面的示例中,请注意 RAND(3) 产生的值序列在它出现的两个地方都是相同的。

如果没有,有没有办法只使用一个查询来存档相同的效果?

4

2 回答 2

11

看看sqlite3_randomness()函数:

SQLite 包含一个高质量的伪随机数生成器 (PRNG),用于在将新记录插入已使用最大可能 ROWID 的表中时选择随机 ROWID。PRNG 也用于内置 random() 和 randomblob() SQL 函数。

...

第一次调用此例程(内部或应用程序)时,PRNG使用从默认 sqlite3_vfs 对象的 xRandomness 方法获得的随机性播种。在所有后续调用中,伪随机性是在内部生成的,无需使用 sqlite3_vfs xRandomness 方法。

查看此xRandomness方法的源代码,您可以看到它是从/dev/urandomUnix 上读取的。在 Windows 上,它只返回一些时间函数的返回值。因此,您唯一的选择似乎是开始破解 SQLite 源代码。

于 2010-01-31T12:14:04.187 回答
6

如果你需要一个伪随机顺序,你可以这样做(PHP):

$seed = md5(mt_rand());
$prng = ('0.' . str_replace(['0', 'a', 'b', 'c', 'd', 'e', 'f'], ['7', '3', '1', '5', '9', '8', '4'], $seed )) * 1;
$query = 'SELECT id, name FROM table ORDER BY (substr(id * ' . $prng . ', length(id) + 2))';

另外,您可以将 $seed 设置为预定义的值并始终获得相同的结果。

我从我的同事那里学到了这个技巧http://steamcooker.blogspot.com/

于 2010-03-18T13:02:45.223 回答