大于RAND_MAX的随机数

#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;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值