9

plpgsql で重複していない乱数の乱数を生成する必要があります。非重複数は [1,1001] の範囲に収まるものとします。ただし、コードは 1001 を超える数を生成します。

directed2number := trunc(Random()*7+1);
counter := directed2number
while counter > 0
loop
to_point := trunc((random() * 1/directed2number - counter/directed2number + 1) * 1001 +1);
...
...
counter := counter - 1;
end loop;
4

2 に答える 2

4

私が正しく理解していれば

  • 乱数の乱数 ( 1 から 8 ) が必要です。
  • 乱数の範囲は1 ~ 1001です。
  • 乱数は一意である必要があります。複数回出現するものはありません。

CREATE OR REPLACE FUNCTION x.unique_rand_1001()
RETURNS SETOF integer AS
$body$
DECLARE
    nrnr    int := trunc(random()*7+1);  -- number of numbers
BEGIN

    RETURN QUERY
    SELECT (1000 * random())::integer + 1
    FROM   generate_series(1, nrnr*2)
    GROUP  BY 1
    LIMIT  nrnr;

END;
$body$ LANGUAGE plpgsql VOLATILE;

電話:

SELECT x.unique_rand_1001();

番号は によって一意になりGROUP BYます。重複が削除された場合に十分な数を提供するために、必要な数の 2 倍の数を生成します。与えられたタスクの次元 (1001 個の数字のうち最大 8 個) では、十分な数が残っていないことは天文学的にありそうにありません。最悪のシナリオ: 視聴者数が返されます。

于 2011-11-30T03:44:34.627 に答える
2

PostgreSQLではそのように問題に取り組むことはしません。

ソフトウェアエンジニアリングの観点からは、xとyの間にランダムな整数を生成し、それらの整数の「n」を生成し、結果がセットであることを保証することを分離すると思います。

-- Returns a random integer in the interval [n, m].
-- Not rigorously tested. For rigorous testing, see Knuth, TAOCP vol 2.
CREATE OR REPLACE FUNCTION random_integer(integer, integer)
  RETURNS integer AS
$BODY$
   select cast(floor(random()*($2 - $1 +1)) + $1 as integer);
$BODY$
  LANGUAGE sql VOLATILE

次に、1から1000までの単一のランダムな整数を選択するには、

select random_integer(1, 1000);

1から1000までの100個のランダムな整数を選択するには、

select random_integer(1, 1000)
from generate_series(1,100);

アプリケーションコードまたはデータベースのいずれかで一意性を保証できます。RubyはSetクラスを実装します。他の言語には、さまざまな名前で同様の機能があります。

データベースでこれを行う1つの方法は、ローカル一時テーブルを使用します。重複の削除を補うために、必要以上の整数を生成する必要性に関するErwinの権利。このコードは20を生成し、挿入された順序で最初の8行を選択します。

create local temp table unique_integers (
    id serial primary key,
    n integer unique
);

insert into unique_integers (n)
select random_integer(1, 1001) n
from generate_series(1, 20)
on conflict (n) do nothing;

select n 
from unique_integers
order by id
fetch first 8 rows only;
于 2011-11-29T18:39:39.297 に答える