Générer un nombre aléatoire de nombres aléatoires non dupliqué dans [0, 1001] à travers une boucle
-
25-10-2019 - |
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;
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);