【发布时间】:2013-09-09 03:43:31
【问题描述】:
我正在阅读带有 glibc 源代码的 c standard library rand() function implementation。 stdlib/random_r.c,第 359 行
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;
}
我不明白(buf->rand_type != TYPE_0)时random_r如何生成随机数,请解释一下?谢谢。
【问题讨论】:
-
在我看来就像一个标准的老式线性同余生成器(谷歌搜索)。不是一个好的算法,但可以用于简单的使用。