兰德实施
我想通过如何实现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 */ }
希望这可以帮助。
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; }
glibc(gcc使用)是一个简单的公式:
x = 1103515245 * x + 12345
如图所示,包装在2 32 。 您可以将x
设置为种子,然后继续调用函数来评估该expression式(并更新种子)。
但是你应该知道这样的线性同余发生器被认为是足够的,但并不理想。
虽然唯一理想的随机数发生器是完全随机的,但梅森捻转机可能更接近。