Реализация Rand
Я хотел бы пройти через то, как реализованы функции rand() и srand (), и хотел бы настроить код, чтобы изменить его в соответствии с моими требованиями. Где я могу найти исходный код RAND() и srand().
3 ответов
Он принимает семя, как во входном аргументе, обычно следующим образом: -
double result = srand(time(NULL));
и возвращает случайное число, которое соответствует вероятности и, следовательно, ожидаемому числу вхождений.
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 one (используется gcc) - это простая формула:
x = 1103515245 * x + 12345
обертывание в 232, как показано здесь. Вы можете просто установить x
в качестве семени затем продолжайте вызывать функцию для оценки этого выражения (и обновления семени).
но вы должны знать, что линейные конгруэнтные генераторы, подобные этому, считаются адекватными, но не идеальными.
пока единственный идеальный генератор случайных чисел был бы совершенно случайным, Мерсенн Твистер наверное, подходит ближе.