2

これがすべての列で異なる乱数を返すのはなぜですか? を使えばいつも同じ乱数になると思っていましたsetseed()。しかし、 の呼び出しごとに乱数の新しい定数ベクトルがあるようですrandom()

SQLフィドル

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();

これは少し奇妙ではありませんか?つまり、列単位で機能しないのはなぜですか?

4

2 に答える 2

2

クエリのこの部分は

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

行に対して 3 つの乱数を生成しています!

于 2013-06-13T18:07:13.890 に答える
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

しかし、それがどれほど信頼できるものかはわかりません。

于 2013-06-13T20:58:58.357 に答える