我们需要一个合适的随机数生成器。假设 C 标准委员会在 ISO 9899:1990 标准中指定随机数生成器时大致知道他们在做什么,下面是该生成器在两个函数中的实现,sp_setseed(0 和 sp_random()。返回值的范围是 0..32767。
示例如下:
CREATE PROCEDURE sp_setseed(n INTEGER)
DEFINE GLOBAL seed DECIMAL(10) DEFAULT 1;
LET seed = n;
END PROCEDURE;
CREATE PROCEDURE sp_random() RETURNING INTEGER;
DEFINE GLOBAL seed DECIMAL(10) DEFAULT 1;
DEFINE d DECIMAL(20,0);
LET d = (seed * 1103515245) + 12345;
-- MOD function does not handle 20-digit values... Dammit!!
LET seed = d - 4294967296 * TRUNC(d / 4294967296);
RETURN MOD(TRUNC(seed / 65536), 32768);
END PROCEDURE;