Question

Je dois générer un nombre aléatoire de nombres aléatoires non dupliquée dans plpgsql. Le nombre non dupliquée tombe dans la plage de [1,1001]. Toutefois, le code génère nombre supérieur à 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;
Était-ce utile?

La solution

Si je comprends bien

  • Vous avez besoin d'un nombre aléatoire ( 1 à 8 ) de nombres aléatoires.
  • La durée de nombres aléatoires 1-1001 .
  • Les nombres aléatoires doivent être uniques . Nul ne semble plus d'une fois.

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;

Appel:

SELECT x.unique_rand_1001();

Les chiffres sont rendus uniques par le GROUP BY. Je produis deux fois plus de chiffres que nécessaire pour fournir un nombre suffisant en double de cas sont supprimés. Avec les dimensions données de la tâche (max. 8 de 1001 numéros), il est peu probable que astronomiquement reste un nombre insuffisant. Dans le pire des cas. le nombre des spectateurs sont retournés

Autres conseils

Je n'aborder le problème de cette façon dans PostgreSQL. Quelque chose le long de ces lignes semble plus logique.

-- Returns a random integer in the interval [n, m].
CREATE OR REPLACE FUNCTION random_integer(integer, integer)
  RETURNS integer AS
$BODY$
   select trunc( $1 + (($2*random()) ))::integer
$BODY$
  LANGUAGE sql VOLATILE

Ensuite, pour sélectionner un nombre entier aléatoire compris entre 1 et 1000,

select random_integer(1, 1000);

100 Pour sélectionner des nombres entiers aléatoires compris entre 1 et 1000,

select random_integer(1, 1000)
from generate_series(1,100);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top