2010-01-31 3 views
5

ли поддержка (SQLite высева функцию RANDOM() так же, как MySQL делает с RAND()?Посев SQLite RANDOM)

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

Из Руководства по MySQL о RAND(N):

Если константа целочисленный аргумент N указан , он используется в качестве значения семян , который производит повторяемый последовательность значений столбцов , В следующем примере обратите внимание, что последовательности значений , созданных RAND (3), являются одинаковыми местами, где происходит.

Если нет, можно ли каким-либо образом архивировать один и тот же эффект, используя только один запрос?

ответ

3

Если вам нужен псевдослучайного заказ, вы можете сделать что-то вроде этого (PHP):

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

Кроме того, вы можете установить $ семя на заранее определенное значение и всегда получают одинаковые результаты.

Я узнал этот трюк с моим коллегой http://steamcooker.blogspot.com/

+0

Можете ли вы объяснить это решение? – Luda

+0

К сожалению, это не очень хорошо масштабируется для больших таблиц. –

+0

Люда, жаль, что не отвечал вовремя. http://stackoverflow.com/a/24511461/296520 - хорошее объяснение того, что там происходит. – jankkhvej

10

Посмотрите на sqlite3_randomness() функции:

SQLite содержит высококачественный псевдо-генератор случайных чисел (PRNG) используется для выбора случайных ROWID'ы тех при вставке новых записей в таблицу, которая уже использует максимально возможное ROWID. PRNG также используется для встроенных функций random() и randomblob() SQL.

...

В первый раз, эта подпрограмма вызывается (либо внутри, либо заявке) PRNG является высевают с помощью случайности, полученной из метода xRandomness из sqlite3_vfs по умолчанию объекта. Во всех последующих вызовах псевдослучайность создается внутри и без обращения к методу sqlite3_vfs xRandomness.

Глядя на источник этого xRandomness метода, вы можете увидеть, что он читает из /dev/urandom на Unix. В Windows он просто возвращает возвращаемые значения некоторых временных функций. Поэтому кажется, что ваш единственный вариант - начать взлом исходного кода SQLite.

Смежные вопросы