Rand Implementation
I would like to go through how rand() and srand() functions are implemented and would like to tweak the code to modify it to my requirements. Where can i find the source code of rand() and srand().
rand
and srand
are usually implemented as a simple LCG, you can easily write your own (it's few lines of code) without looking for the sources of rand
and srand
. Notice that, if you need random numbers for "serious" purposes (e.g. cryptography), there are much better RNGs than LCG.
By the way, the C standard itself includes a sample implementation of rand
and 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;
}
It takes a seed as in input argument, usually like follows:-
double result = srand(time(NULL));
and returns a random number that adheres to the probability and hence expected number of occurrences.
from 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 */
}
Hope this helps.