Рэнд Реализация - PullRequest
       14

Рэнд Реализация

12 голосов
/ 22 января 2011

Я бы хотел узнать, как реализованы функции rand () и srand (), и хотел бы настроить код, чтобы изменить его в соответствии с моими требованиями. Где я могу найти исходный код rand () и srand ().

Ответы [ 3 ]

23 голосов
/ 22 января 2011

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;
}
9 голосов
/ 22 января 2011

Он принимает начальное число, как во входном аргументе, обычно так: Форумы 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 */
}

Надеюсь, это поможет.

6 голосов
/ 22 января 2011

glibc one (используется gcc) - это простая формула:

x = 1103515245 * x + 12345

обтекание в 2 32 , как показано здесь . Вы можете просто установить x в качестве начального числа, а затем продолжать вызывать функцию для оценки этого выражения (и обновления начального числа).

Но вы должны знать, что линейные конгруэнтные генераторы, подобные этому, считаются адекватными, но не идеальными.

Хотя единственный идеальный генератор случайных чисел был бы совершенно случайным, Mersenne Twister , вероятно, подходит ближе.

...