在postgresql的循环内生成随机数
Generate random inside a loop in postgresql
我想执行几次(比如 30 次)涉及随机数的 "experiment"
我的方法是:
select
rnd
from
generate_series(0,30) as l, -- number of times
lateral (
select random() as rnd -- the "experiment"
) as t ;
您可以将其解读为“执行 30 次实验”。
问题是该代码生成了 30 个精确 个数字。
请注意:"experiment"部分显然更复杂,但在其中某处,它会为每个实验创建数百个随机数运行。即我想生成那数百个随机数,30 次。这很重要,因为我知道我可以执行
select random() from generate_series(0,30)
并获得 30 个不同的随机数,但这不是我打算做的。
你的问题是 LATERAL
查询不依赖于左边的 table 表达式,所以 PostgreSQL 只计算一次。
要对左侧 table 表达式中的每一行求值一次,引入依赖关系:
SELECT rnd
FROM generate_series(0,30) as l -- number of times
CROSS JOIN LATERAL (
SELECT l.l * 0 + random() AS rnd -- the "experiment"
) AS t;
我想执行几次(比如 30 次)涉及随机数的 "experiment"
我的方法是:
select
rnd
from
generate_series(0,30) as l, -- number of times
lateral (
select random() as rnd -- the "experiment"
) as t ;
您可以将其解读为“执行 30 次实验”。
问题是该代码生成了 30 个精确 个数字。
请注意:"experiment"部分显然更复杂,但在其中某处,它会为每个实验创建数百个随机数运行。即我想生成那数百个随机数,30 次。这很重要,因为我知道我可以执行
select random() from generate_series(0,30)
并获得 30 个不同的随机数,但这不是我打算做的。
你的问题是 LATERAL
查询不依赖于左边的 table 表达式,所以 PostgreSQL 只计算一次。
要对左侧 table 表达式中的每一行求值一次,引入依赖关系:
SELECT rnd
FROM generate_series(0,30) as l -- number of times
CROSS JOIN LATERAL (
SELECT l.l * 0 + random() AS rnd -- the "experiment"
) AS t;