大于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;
}
相关文章推荐
- C/C++ 使用rand()组合形式生成大于15位的随机数时存在的问题
- sga_target大于Sga_max_size
- 不能用循环和本地变量,对一个整形n,实现输出n,2n,4n,...当大于max(比如5000)时再逆向输出...4n,2n,n
- 随机数的产生器rand()和初始化随机数产生器函数srand()
- sga_target大于指定值的sga_max_size
- PHP RAND_MAX()
- rand()函数生成随机数
- C++随机数 (rand srand)用法,注意随机数种子每次要更新。
- C/C++中产生随机数(rand,srand用法)
- [zz]求随机数构成的数组中找到长度大于或等于3的最长的等差数列
- C++中用rand()和srand()产生为随机数方法介绍
- 神奇的随机数rand()
- C++利用srand和rand产生随机数
- TCL脚本语言-生成指定区间的随机数-rand-RandomRange
- 在做性能测试的时候发现loadfile大于max值的错误?
- c语言中利用rand()time()srand()....产生随机数【4-5】猜数游戏
- rand 和 srand产生随机数
- 随机数问题(srand(),rand())
- C语言区间随机数生成 with srand() & rand() & time() (转)
- C语言中随机数产生 rand和srand