В PostgreSQL, setseed()
функцията задава семето за последващо random()
повиквания (стойност между -1.0 и 1.0, включително).
random()
функцията генерира псевдослучайно число, използвайки прост линеен конгруентен алгоритъм.
Ако setseed()
се извиква резултатите от последващи random()
повикванията в текущата сесия се повтарят чрез повторно издаване на setseed()
със същия аргумент.
Пример
Ето пример, за да демонстрирате как работи.
SELECT
setseed(0.8),
random(),
random();
Резултат:
setseed | random | random ---------+--------------------+-------------------- | 0.7998745861323613 | 0.9776304992484732
Сега, ако изпълня същото изявление отново, получавам абсолютно същия резултат:
setseed | random | random ---------+--------------------+-------------------- | 0.7998745861323613 | 0.9776304992484732
Само за да е ясно, ето пълния изход в моя терминал, когато стартирам и двата SELECT
изявления едновременно.
SELECT
setseed(0.8),
random(),
random();
SELECT
setseed(0.8),
random(),
random();
Резултат:
postgres=# SELECT postgres-# setseed(0.8), postgres-# random(), postgres-# random(); setseed | random | random ---------+--------------------+-------------------- | 0.7998745861323613 | 0.9776304992484732 (1 row) postgres=# postgres=# SELECT postgres-# setseed(0.8), postgres-# random(), postgres-# random(); setseed | random | random ---------+--------------------+-------------------- | 0.7998745861323613 | 0.9776304992484732 (1 row)
Пример БЕЗ Setseed()
Сега ето какво ще се случи, ако изпълня и двата израза отново, но без setseed()
функция.
SELECT
random(),
random();
SELECT
random(),
random();
Резултат:
postgres=# SELECT postgres-# random(), postgres-# random(); random | random --------------------+-------------------- 0.8789931563830109 | 0.8981750563441189 (1 row) postgres=# postgres=# SELECT postgres-# random(), postgres-# random(); random | random --------------------+------------------- 0.3630186384623926 | 0.909389353037664 (1 row)
Така че в този случай вторият израз генерира изцяло нов набор от произволни числа.