兰德实施

我想通过如何实现rand()和srand()函数,并想调整代码来修改它以符合我的要求。 我在哪里可以findrand()和srand()的源代码。

它在input参数中需要一个种子,通常如下所示: –

double result = srand(time(NULL)); 

并返回一个随机数字,该数字符合概率,从而预期出现次数。

来自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 */ } 

希望这可以帮助。

randsrand通常是作为一个简单的LCG来实现的,你可以很容易地写自己的(这是几行代码),而不需要寻找randsrand的来源。 请注意,如果您需要随机数字用于“严重”目的(例如密码学),则有更好的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; } 

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

 x = 1103515245 * x + 12345 

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

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

虽然唯一理想的随机数发生器是完全随机的,但梅森捻转机可能更接近。