setseed()和random()行为

时间:2013-06-13 18:03:24

标签: postgresql

为什么这会在每列中返回不同的随机数?如果我使用setseed(),我认为我会得到相同的随机数。但看起来每个random()的调用都有新的常量随机数向量。

SQLFiddle

select setseed(0.5);
select 
   random(), 
   random(),
   random()
from 
   generate_series(1,20);

每次都返回:

0.798512778244913;0.518533017486334;0.0734698106534779
0.563445927575231;0.00328421639278531;0.859378454275429
0.537976825609803;0.567121817730367;0.311047440394759
0.420166166499257;0.203177386429161;0.125661129131913
0.754696044139564;0.424046442843974;0.202209176961333
...

现在我看到(感谢Ed Heal)随机数是由行生成的。为了证明这一点:

select setseed(0.5);
select random(), random(), random();

select setseed(0.5);
select random()
union all
select random()
union all
select random();

这不是有点奇怪吗?我的意思是,为什么它不按列工作?

2 个答案:

答案 0 :(得分:2)

因为这部分查询

select 
   random(), 
   random(),
   random()

为一行生成三个随机数!

答案 1 :(得分:2)

如果您想在所有列中使用相同的值:

select r, r, r
from
    (
        select random() r
        from generate_series(1,3)
    ) s
;
         r         |         r         |         r         
-------------------+-------------------+-------------------
 0.607540448661894 | 0.607540448661894 | 0.607540448661894
 0.973879527300596 | 0.973879527300596 | 0.973879527300596
 0.659207154065371 | 0.659207154065371 | 0.659207154065371

你的想法是这样的:

select setseed(0.5), random(), setseed(0.5), random();
 setseed |      random       | setseed |      random       
---------+-------------------+---------+-------------------
         | 0.798512778244913 |         | 0.798512778244913

但我不知道那是多么可靠。