我想了解如何实现rand()和srand()函数,并希望调整代码以根据我的要求进行修改。我在哪里可以找到rand()和srand()的源代码。
答案 0 :(得分:23)
rand
和srand
通常以简单的LCG实现,您可以轻松编写自己的(几行代码),而无需查找rand
的来源和srand
。请注意,如果您需要随机数字用于“严重”目的(例如加密),那么RNG比LCG要好得多。
顺便说一句,C标准本身包含rand
和srand
的示例实现:
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可能更接近。