Как организована работа rand()?

Как я понимаю, в функции rand() есть какая-то локальная static переменная, которая помнит о предыдущем вызове. Но как эта переменная взаимодействует с инициализирующей функцией srand()? Можно как-то объявить статическую переменную, общую для двух функций? Или там в модуле просто есть глобальная переменная?
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 2
@TheCalligrapher
Вы все совершенно правильно описали: функция rand() является stateful функцией, т.е. она обладает состоянием (state), которое сохраняется между последовательными вызовами функции. И по понятным причинам это состояние также должно быть доступно функции srand().

Однако, во-первых, не ясно, почему вы решили, что это состояние обязательно должно храниться в локальной статической переменной, объявленной внутри функции rand(). Даже если следовать вашей логике, то намного разумнее предположить, что это - некая статическая переменная, объявленная не уровне файла (модуля), и немедленно доступная как функции rand(), так и функции srand(). Или даже глобальная переменная. (Во многих реализациях стандартной библиотеки, старающихся поддерживать работу в многопоточных приложениях, это состояние может храниться в thread-локальной переменной.)

Во-вторых, что важнее (!), реализация стандартной библиотеки в общем случае делается платформенно-зависимыми средствами, не имеющими никакого отношения к языкам С или С++. Она может быть реализована на Ассемблере, Фортране или на языке нанайских мальчиков. С языками С или С++ должен быть совместим лишь ее внешний интерфейс, но не внутренняя реализация. Поэтому рассматривать реализацию стандартной библиотеки в терминах языков С или С++ - бессмысленное и некорректное занятие. Реализация стандартной библиотеки живет по своим законам. Если ей нужно, чтобы состояние rand() было также доступно в srand() - значит так и будет. А как это сделано - волшебство конкретной реализации.
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Хотите рандома, берите что то нормальное. И желательно железное.
Какая ОС?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы