Как я могу найти точный rand(), используемый в библиотеке C?
В рамках моей курсовой работы мне нужно найти и перекодировать генератор случайных чисел rand(), который выводит те же числа, что и оригинал. Начальная последовательность 1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421 1025202362 и может быть сгенерирована по http://ideone.com/H7tsSI.
#include <stdlib.h> /* rand */
#include <iostream>
using namespace std;
int main ()
{
for (int i = 0 ; i< 10 ; i++) {
cout << rand() << " ";
}
cout << rand();
return 0;
}
Моя проблема в том, что я не могу найти исходный источник этого генератора, и я не знаю, как я могу выяснить, как генератор работает из полной последовательности генератора, которая состоит из 100 чисел. Может ли кто-нибудь помочь мне найти оригинальный генератор или научить меня, как найти генератор из его последовательности? Спасибо!
2 ответа
В зависимости от вашего конкретного компилятора у вас может быть доступный исходный код. В Visual Studio 12.0, например, rand()
Исходный код:
int __cdecl rand (
void
)
{
_ptiddata ptd = _getptd();
return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );
}
Если ваш компилятор не включает исходный код для своей библиотеки C, вы можете попробовать использовать дизассемблер, чтобы собрать воедино его версию rand()
функция делает. Как правило, большинство из них будут иметь те же строки, что и приведенный выше код: получить доступ к переменной состояния, которая была результатом последнего вызова rand()
(или семя, если это первый вызов), выполните перестановку над ним, а затем запишите это обратно в переменную состояния.
Вы можете найти реализацию исходной библиотеки, используемой GNU, по адресу http://www.gnu.org/software/libc/ Если вы знакомы с GIT, вы можете использовать управление исходным кодом GIT, например:
$> git clone git://sourceware.org/git/glibc.git
Функция rand(), по сути, вызывает различные функции - сначала __random, который, в свою очередь, вызывает __random_r. Нажмите на имена функций, чтобы обратиться к исходному репозиторию в версии 2.15
Для более подробной информации, смотрите ответы здесь - gcc реализация rand()