char *initstate(unsigned int seed, char *state, size_t n);
Должен ли я перед вызовом initstate()
заполнить массив state[]
некоторыми данными? Игнорирует ли функция initstate
все содержимое массива состояний? Только предоставленные size
и seed
имеют значение? Является ли целью initstate
заполнить массив state[]
без учета его текущего содержимого?
Я видел как минимум 1 пример в сети, заполняющий массив state[] перед вызовом initstate. -- Я не могу найти URL, извините. -- Но мой опыт показывает, что пока начальное число остается неизменным, (предыдущее) содержимое массива state[]
не имеет значения. С точки зрения последовательных случайных чисел, полученных функцией random()
.
Функция initstate()
"позволяет инициализировать массив состояний state
для использования random()
". Другими словами, initstate()
запишет новое состояние в переданный state
буфер, а затем установит его как текущее внутреннее состояние, которое будет использоваться (и обновляться) последующими random()
вызовами. Это также можно увидеть в исходниках glibc. С другой стороны, функция setstate()
принимает уже инициализированный state
и устанавливает его как внутреннее состояние как есть.
Is the purpose of
initstate
to fill thestate[]
array without taking into account its current content?
Да, правильно.
I have seen at least 1 example on the net, filling the
state[]
array beforeinitstate
call. [...] my experience shows that as long as the seed remains the same, the (previous) content of thestate[]
array does not matter.
Вы правы, это не нужно. Данные в массиве не имеют значения и будут перезаписаны.
Обратите внимание, что
srandom
,random
иinitstate
не являются стандартными функциями C. Почему вам нужно использовать эти функции вместо стандартных функций Csrand
иrand
? И если вы согласны с использованием нестандартных функций, обычно есть лучшие альтернативы, чемrandom
и т. д., Например,drand48
(и семейство).