SQLite是否像MySQL支持**RAND()
一样支持RANDOM()
**函数的种子?
$query = "SELECT * FROM table ORDER BY RAND(" . date('Ymd') . ") LIMIT 1;";
来自RAND(N)
的MySQL手册:
如果指定了一个常量整数参数N,它将被用作种子值,这将产生一个可重复的列值序列。在下面的示例中,请注意,兰德(3)产生的值序列在它出现的两个位置都是相同的。
如果没有,是否有任何方法可以只使用一个查询来归档相同的效果?
3条答案
按热度按时间ncecgwcz1#
看看
sqlite3_randomness()
函数:SQLite包含一个高质量的伪随机数生成器(PRNG),用于在向已经使用最大可能ROWID的表中插入新记录时选择随机ROWID。PRNG也用于内置的random()和randomblob()SQL函数。
...
第一次调用此例程时(内部调用或应用程序调用),PRNG将使用从默认sqlite3_vfs对象的xRandomness方法获得的随机性进行播种。在所有后续调用中,伪随机性将在内部生成,而无需求助于sqlite3_vfs xRandomness方法。
查看这个
xRandomness
方法的源代码,你可以看到它在Unix上从/dev/urandom
读取。在Windows上,它只是返回一些时间函数的返回值。所以看起来你唯一的选择就是开始破解SQLite源代码。anauzrmj2#
如果你需要一个伪随机顺序,你可以这样做(PHP):
另外,您可以将$seed设置为预定义的值,并始终获得相同的结果。
我从我的同事http://steamcooker.blogspot.com/那里学到了这个技巧
qaxu7uf23#
基于@jankkhvej的答案,我将修改代码,以使用预定义的种子(整数-32位数字)控制生成PRNG并记录代码。
实际上,PHP中的种子是使用函数mt_srand($seed)定义的
试试onlin demo
输出
我提供了生成PNRG的替代解决方案,您可以找到here