8

SQLiteはRANDOM()、MySQLと同じ方法で関数のシードをサポートしていRAND()ますか?

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

MySQLマニュアルからRAND(N)

定数整数引数Nが指定されている場合、それはシード値として使用され、列値の繰り返し可能なシーケンスを生成します。次の例では、RAND(3)によって生成される値のシーケンスは、それが発生する両方の場所で同じであることに注意してください。

そうでない場合、1つのクエリのみを使用して同じ効果をアーカイブする方法はありますか?

4

2 に答える 2

11

関数を見てくださいsqlite3_randomness()

SQLiteには、可能な限り最大のROWIDをすでに使用しているテーブルに新しいレコードを挿入するときに、ランダムなROWIDを選択するために使用される高品質の疑似乱数ジェネレーター(PRNG)が含まれています。PRNGは、組み込みのrandom()およびrandomblob()SQL関数にも使用されます。

..。

このルーチンが(内部またはアプリケーションによって)初めて呼び出されると、PRNGは、デフォルトのsqlite3_vfsオブジェクトのxRandomnessメソッドから取得されたランダム性を使用してシードされます。以降のすべての呼び出しで、疑似ランダム性は内部で生成され、sqlite3_vfsxRandomnessメソッドに頼ることはありません。

このメソッドのソースを見ると、UnixxRandomnessから読み取られていることがわかります。/dev/urandomWindowsでは、一部の時間関数の戻り値を返すだけです。したがって、唯一の選択肢は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 に答える