Отбор СЛУЧАЙНЫЙ SQLite ()

Делает отбор поддержки SQLite RANDOM() функционируйте тот же способ, с которым делает MySQL RAND()?

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

От MySQL Manual о RAND(N):

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

В противном случае там какой-либо путь состоит в том, чтобы заархивировать тот же эффект с помощью только одного запроса?

7
задан Alix Axel 31 August 2013 в 09:19
поделиться

2 ответа

Если вам нужен псевдослучайный порядок, вы можете сделать что-то вроде этого (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)';

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

Я научился этому приему у своего коллеги http://steamcooker.blogspot.com/

5
ответ дан 6 December 2019 в 14:04
поделиться

Взгляните на функцию sqlite3_randomness() :

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

...

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

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

10
ответ дан 6 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: