Mat*_*lia 24
rand和srand通常为一个简单的实施LCG,你可以很容易地编写自己的(这是几行代码),而不找的来源rand和srand.请注意,如果您需要用于"严重"目的的随机数(例如加密),则存在比LCG更好的RNG.
顺便说一下,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;
}
Run Code Online (Sandbox Code Playgroud)
eva*_*rix 10
它在输入参数中需要种子,通常如下: -
double result = srand(time(NULL));
Run Code Online (Sandbox Code Playgroud)
并返回一个随机数,该数字符合概率,因此符合预期的出现次数.
来自CodeGuru论坛: -
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 */
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
glibc one(由gcc使用)是一个简单的公式:
x = 1103515245 * x + 12345
Run Code Online (Sandbox Code Playgroud)
缠绕在2 32,如图所示在这里.您可以将其设置x为种子,然后继续调用函数来评估该表达式(并更新种子).
但你应该知道这样的线性同余发生器被认为是足够的但不理想.
虽然唯一理想的随机数发生器是完全随机的,但Mersenne Twister可能更接近.