czw1413_cn 发表于 2007-07-18 09:09

ivhb 发表于 2007-07-18 09:27

如果不保存中间结果,基本很难实现随机数。
你可以参考

   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

wenlq 发表于 2007-07-18 12:14

http://www.iiug.org/resources/faq/ifaq04c.htm.1#4.8.8

ivhb 发表于 2007-07-18 13:55

wenlq :
那个faq我很有兴趣,但是我没有办法完整的下载,你能告诉我一个可以下载的地方么?
你给的URL上,有个ftp下载该faq的地址,但是那个地址好像不可用。

wenlq 发表于 2007-07-18 15:03

以前下的一个

ivhb 发表于 2007-07-18 15:34

thx a lot

czw1413_cn 发表于 2007-07-22 11:15

ivhb 发表于 2007-07-24 12:29


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 编辑 ]

czw1413_cn 发表于 2007-07-24 18:39

页: [1]
查看完整版本: 请教一个生成随机数的函数