兰德实施

时间:2011-01-22 13:49:58

标签: c gcc random

我想了解如何实现rand()和srand()函数,并希望调整代码以根据我的要求进行修改。我在哪里可以找到rand()和srand()的源代码。

3 个答案:

答案 0 :(得分:23)

randsrand通常以简单的LCG实现,您可以轻松编写自己的(几行代码),而无需查找rand的来源和srand。请注意,如果您需要随机数字用于“严重”目的(例如加密),那么RNG比LCG要好得多。

顺便说一句,C标准本身包含randsrand的示例实现:

static unsigned long int next = 1;

int rand(void) // RAND_MAX assumed to be 32767
{
    next = next * 1103515245 + 12345;
    return (unsigned int)(next/65536) % 32768;
}

void srand(unsigned int seed)
{
    next = seed;
}

答案 1 :(得分:9)

它在输入参数中使用种子,通常如下所示: -

double result = srand(time(NULL));

并返回一个随机数,该数字符合概率,因此也符合预期的出现次数。

来自CodeGuru forums: -

void __cdecl srand (unsigned int seed)
{
    #ifdef _MT
        _getptd()->_holdrand = (unsigned long)seed;
    #else /* _MT */
        holdrand = (long)seed;
    #endif /* _MT */
}

int __cdecl rand (void)
{
   #ifdef _MT
    _ptiddata ptd = _getptd();
    return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) &
    0x7fff );
   #else /* _MT */
    return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
   #endif /* _MT */
}

希望这有帮助。

答案 2 :(得分:6)

glibc one(由gcc使用)是一个简单的公式:

x = 1103515245 * x + 12345

环绕2 32 ,如图here所示。您可以将x设置为种子,然后继续调用函数来评估该表达式(并更新种子)。

但你应该知道像这样的线性同余生成器被认为是足够的但不理想。

虽然唯一理想的随机数生成器是完全随机的,但Mersenne Twister可能更接近。