Есть ли причина, по которой вы не просто используете rand()
, который является частью стандартной библиотеки C ++?Функция, на которую вы ссылаетесь, является частью спецификации Single UNIX, но, вероятно, она не переносима ...
Причина, по которой вы получаете одно и то же значение снова и снова, заключается в том, что вы не заполняете генератор случайных чиселтак ведет себя детерминистически.Используйте srand()
или srand48()
, если вы в порядке с функциями, специфичными для UNIX, и нуждаетесь в 48-битной точности. Вызывайте его только один раз в начале вашей программы и передавайте time(NULL)
.Не беспокойтесь об использовании time()
, поскольку вы вызываете эту функцию только один раз, вам не нужно беспокоиться о том, чтобы всегда получать одно и то же значение времени.
Вы также можете обратиться к этой страницео том, как взять возвращаемое значение из rand()
и масштабировать его до нужного вам диапазона:
ИСПОЛЬЗОВАТЬ C ИЛИ C ++ rand () ФУНКЦИЯ
РЕДАКТИРОВАТЬ: Вернитесь и прочитайте документы для erand48
снова.Вы заметите, что он возвращает удвоение в диапазоне [0, 1).Вы помещаете это в long, поэтому, вероятно, вы всегда видите ноль (значение усекается до целого числа).Я также думаю, что он, вероятно, обновляет значения массива unsigned long
для вас с текущим номером в последовательности - вы предоставляете хранилище, оно использует его для «отслеживания» последовательности.
Попробуйте:
unsigned short xsubi[3] = { 0, 1, 27 };
for (int i = 0; i < 10; ++i)
{
double value = erand48(xsubi);
printf("%f\n", value);
}