q1) Является ли эта реализация rand () и srand (): правильной?
Я бы сказал, нет.
* Код определенно не ограничивает диапазон rand()
до [0...INT_MAX]
. @ Флюгер . return __seed & INT_MAX
решит это.
* Незарезервированный идентификатор __seed
- это нет-нет. C17dr 7.1.3 1. Я бы ожидал, что static unsigned __seed
ограничит область.
* Для пользователя, сделавшего rand(),srand()
, я бы также ожидал определение RAND_MAX
.
q1) Является ли эта реализация rand () и srand (): используемой самыми популярными реализациями?
Сомнительно. IAC, «наиболее популярные» реализации субъективны. Производятся миллиарды встроенных процессоров в год, и их популярность и небольшая площадь могут исказить идею «самой популярной» реализации. Я не вижу никакого преимущества, если предположить такую реализацию, кроме как использовать слабый rand()
. Я ожидаю, что большинство реализаций будет стремиться использовать более широкое состояние, чем начальное число. **
q1) Является ли эта реализация rand () и srand (): требуетсястандарт?
Нет. Стандарт довольно открытый.
** Хотя начальное значение ограничено unsigned
, скажем, 32-битным, переменная состояния может быть намного шире - возможно, сотнибит. Конечно, это означает, что все состояния не могут быть начальными точками.
srand()
начальное число также может в основном игнорироваться. Когда я читаю спецификацию, нет необходимости использовать все биты начального числа.
Качество srand(), rand()
может быть большим или слабым - такой же маленький диапазон, как [0...32767]
и, возможно, цикл, которыйтоже маленький.
q4) Можем ли мы выяснить, какое семя предшествует последовательности?
Грубая сила приходит на ум - попробуйте много семян. По спецификации, та же самая начальная точка будет генерировать ту же самую выходную последовательность rand()
для реализации , что и реализация . Кроме этого, не указан способ. Обратите внимание, что желаемое начальное число может не существовать для достижения выбранной последовательности rand()
из начального числа.