【问题标题】:Set Seed for generating Random Value from Uniform Distribution between 0 and 1 in Oracle SQL在 Oracle SQL 中设置种子以从 0 到 1 之间的均匀分布生成随机值
【发布时间】:2020-12-03 00:16:45
【问题描述】:

我有一个简单的选择查询,它使用 DBMS_RANDOM.value 函数从 0 到 1 之间的均匀分布中生成一个随机值。例如,我的 SQL 查询类似于:

select
  DBMS_RANDOM.value(0, 1),
  *
from table

问题是每次我运行此查询时,都会出现一组不同的随机值。有没有办法设置种子以获得一组可重现的随机值?

【问题讨论】:

  • dbms_random.seed 听起来是个不错的起点。

标签: oracle


【解决方案1】:

如评论中所述,您可以使用DBMS_RANDOM.seed 并提供种子值。

如果您想始终如一地生成同一组伪随机数,请始终使用相同的种子。 seed 过程中允许的值为 integerstring 最多 2000 个字符。

例子:

SQL> SET SERVEROUTPUT ON
SQL> BEGIN
  2
  3    DBMS_OUTPUT.put_line(CHR(10) || 'Set-1: Setting the SEED to 59' || CHR(10));
  4    DBMS_RANDOM.seed (59); --Setting the SEED
  5    FOR I IN 1 ..3 LOOP
  6      DBMS_OUTPUT.put_line(DBMS_RANDOM.value(1,100));
  7    END LOOP;
  8
  9    DBMS_OUTPUT.put_line(CHR(10) || 'Set-2: Resetting the SEED to 36. All values will be different than Set-1' || CHR(10));
 10    DBMS_RANDOM.seed (36); --Setting the SEED
 11    FOR I IN 1 ..3 LOOP
 12      DBMS_OUTPUT.put_line(DBMS_RANDOM.value(1,100));
 13    END LOOP;
 14
 15      DBMS_OUTPUT.put_line(CHR(10) || 'Set-3: Resetting the SEED to 59 again. All values after this reset will be same as Set-1' || CHR(10));
 16    DBMS_RANDOM.seed (59); --Setting the SEED
 17    FOR I IN 1 ..3 LOOP
 18      DBMS_OUTPUT.put_line(DBMS_RANDOM.value(1,100));
 19    END LOOP;
 20
 21  END;
 22  /

Set-1: Setting the SEED to 59

74.14289538766981707792811687463755022131
51.25884047075217918289983306078006505072
94.75163705940204976856341395424131478654

Set-2: Resetting the SEED to 36. All values will be different than Set-1

53.86999730393101252712983137930835072954
96.38611422814157294559942815958666746821
28.70442013260713167837548432433093564504

Set-3: Resetting the SEED to 59 again. All values after this reset will be same as Set-1

74.14289538766981707792811687463755022131
51.25884047075217918289983306078006505072
94.75163705940204976856341395424131478654

PL/SQL procedure successfully completed.

SQL>

【讨论】:

  • 有趣!无论如何我可以像我在原始帖子中发布的那样在简单的SELECT 查询中设置种子吗?
  • SEED 是程序。所以在选择查询中是不允许的。但是您可以创建一个接受种子值的函数,使用该种子值并基于它返回随机数。但这取决于您的要求。可以从选择查询中调用函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2013-12-09
相关资源
最近更新 更多