你可以参考
unsigned long int next = 1;
/* rand:return pseudo-random integer on 0..32767 */
int rand(void)
{
next = next * 1103515245 + 12345;
return (unsigned int)(next/65536) % 32768;
}
/* srand:set seed for rand() */
void srand(unsigned int seed)
{
next = seed;
}
这个算法改成SP版本的还是很容易的。只要你每次保存next http://www.iiug.org/resources/faq/ifaq04c.htm.1#4.8.8 wenlq :
那个faq我很有兴趣,但是我没有办法完整的下载,你能告诉我一个可以下载的地方么?
你给的URL上,有个ftp下载该faq的地址,但是那个地址好像不可用。 以前下的一个 thx a lot
CREATE PROCEDURE sp_setseed(n INTEGER)
DEFINE GLOBAL seed DECIMAL(10) DEFAULT 1;
LET seed = n;
END PROCEDURE;
CREATE PROCEDURE sp_random(n integer) 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);
--- is this ok ???
RETURN MOD(TRUNC(seed / 65536), n);
END PROCEDURE;
dbaccess dbname <<EOF
select sp_random(9) from systables
;
EOF
[ 本帖最后由 ivhb 于 2007-7-24 14:56 编辑 ]
页:
[1]