Subject | Rand function in ib_udf |
---|---|
Author | Walter Ogston |
Post date | 2004-06-24T20:07:51Z |
Fear friends,
I am new at Firebird, udfs and stored procs, and using the rand function
from ib_udf in a stored procedure defined as follows:
SET TERM ^;
alter procedure INSERT_KEYS
(proj integer, number_of_keys integer)
returns (keys_created integer)
AS
declare variable i integer;
BEGIN
keys_created = 0;
i = number_of_keys;
while (i > 0) do
begin
insert into answersheet (PROJECT_NUMBER, ANSWER_NUMBER)
values (proj, Rand() * (999999999 - 100000000) + 100000000);
keys_created = keys_created + 1;
i = i - 1;
end
END ^
SET TERM ; ^
The idea is to create a set of random 9-digit values (cardinality =
number_of_keys) for answer_number. When I call this function with
number_of_keys = 1 it works fine, but setting number_of_keys >= 2 I get a
key violation. Primary key of answersheet relation is (project_number;
answer_number).
It looks like the udf function Rand is not getting called again but is
using a cached return value, or else it is being called with the same seed
(according to the documentation in ib_udf.sql "random number generator is
seeded using the current time").
Source for rand (from
http://cvs.sourceforge.net/viewcvs.py/*checkout*/firebird/interbase/extlib/i
b_udf.c?rev=1.3) is:
double EXPORT IB_UDF_rand() { srand( (unsigned)time (NULL)); return
((float) rand() / (float) RAND_MAX); }
Any ideas how to fix or work around this problem?
TIA
Walter
/*----------------
C. Walter Ogston
ogstoncw@... Kalamazoo, Michigan
*/
I am new at Firebird, udfs and stored procs, and using the rand function
from ib_udf in a stored procedure defined as follows:
SET TERM ^;
alter procedure INSERT_KEYS
(proj integer, number_of_keys integer)
returns (keys_created integer)
AS
declare variable i integer;
BEGIN
keys_created = 0;
i = number_of_keys;
while (i > 0) do
begin
insert into answersheet (PROJECT_NUMBER, ANSWER_NUMBER)
values (proj, Rand() * (999999999 - 100000000) + 100000000);
keys_created = keys_created + 1;
i = i - 1;
end
END ^
SET TERM ; ^
The idea is to create a set of random 9-digit values (cardinality =
number_of_keys) for answer_number. When I call this function with
number_of_keys = 1 it works fine, but setting number_of_keys >= 2 I get a
key violation. Primary key of answersheet relation is (project_number;
answer_number).
It looks like the udf function Rand is not getting called again but is
using a cached return value, or else it is being called with the same seed
(according to the documentation in ib_udf.sql "random number generator is
seeded using the current time").
Source for rand (from
http://cvs.sourceforge.net/viewcvs.py/*checkout*/firebird/interbase/extlib/i
b_udf.c?rev=1.3) is:
double EXPORT IB_UDF_rand() { srand( (unsigned)time (NULL)); return
((float) rand() / (float) RAND_MAX); }
Any ideas how to fix or work around this problem?
TIA
Walter
/*----------------
C. Walter Ogston
ogstoncw@... Kalamazoo, Michigan
*/