您的位置:首页 > 其它

大于RAND_MAX的随机数

2012-11-07 14:18 190 查看


#define MAX_RAND 82934829

long((double)rand()/RAND_MAX * MAX_RAND) // 注:RAND_MAX值为32767



【转】stdlib.c 源代码 rand

原来在做单板机,而随机出来的是有规律可循的随机数,于是乎。。。。。。。

想知道rand()这个函数是咋实现的,就在网上搜索了一下,选择了三个实现版本,摘要其关键代码如下

GNU的实现完全不懂 ─_─ #

==========================================================

一、sanos

http://www.jbox.dk/sanos/source/lib/stdlib.c.html

static long holdrand = 1L;

void srand(unsigned int seed)

{

holdrand = (long) seed;

}

int rand()

{

return (((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);

}

==========================================================

二、FreeBSD

http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdlib/

static int

do_rand(unsigned long *ctx)

{

#ifdef USE_WEAK_SEEDING

/*

* Historic implementation compatibility.

* The random sequences do not vary much with the seed,

* even with overflowing.

*/

return ((*ctx = *ctx * 1103515245 + 12345) % ((u_long)RAND_MAX + 1));

#else /* !USE_WEAK_SEEDING */

/*

* Compute x = (7^5 * x) mod (2^31 - 1)

* wihout overflowing 31 bits:

* (2^31 - 1) = 127773 * (7^5) + 2836

* From "Random number generators: good ones are hard to find",

* Park and Miller, Communications of the ACM, vol. 31, no. 10,

* October 1988, p. 1195.

*/

long hi, lo, x;

/* Can't be initialized with 0, so use another value. */

if (*ctx == 0)

*ctx = 123459876;

hi = *ctx / 127773;

lo = *ctx % 127773;

x = 16807 * lo - 2836 * hi;

if (x < 0)

x += 0x7fffffff;

return ((*ctx = x) % ((u_long)RAND_MAX + 1));

#endif /* !USE_WEAK_SEEDING */

}

int

rand_r(unsigned int *ctx)

{

u_long val = (u_long) *ctx;

int r = do_rand(&val);

*ctx = (unsigned int) val;

return (r);

}

static u_long next = 1;

int

rand()

{

return (do_rand(&next));

}

void

srand(seed)

u_int seed;

{

next = seed;

}

=============================================================

三、GNU libc

http://ftp.gnu.org/gnu/glibc/

int

__random_r (buf, result)

struct random_data *buf;

int32_t *result;

{

int32_t *state;

if (buf == NULL || result == NULL)

goto fail;

state = buf->state;

if (buf->rand_type == TYPE_0)

{

int32_t val = state[0];

val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;

state[0] = val;

*result = val;

}

else

{

int32_t *fptr = buf->fptr;

int32_t *rptr = buf->rptr;

int32_t *end_ptr = buf->end_ptr;

int32_t val;

val = *fptr += *rptr;

/* Chucking least random bit. */

*result = (val >> 1) & 0x7fffffff;

++fptr;

if (fptr >= end_ptr)

{

fptr = state;

++rptr;

}

else

{

++rptr;

if (rptr >= end_ptr)

rptr = state;

}

buf->fptr = fptr;

buf->rptr = rptr;

}

return 0;

fail:

__set_errno (EINVAL);

return -1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: