LINUX.ORG.RU

rand()


0

0

я правельно понял, что в gcc фун-я rand() возращает все время одни и те же числа?

anonymous

Неправельно. Перед вызовом rand() нужно вызывать srand, например:

srand(time(NULL)+getpid());

rand();

anonymous
()
Ответ на: комментарий от Zenom

>> Взять остаток от деления, делов-то.

Не учи плохому!

In Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New York: Cambridge University Press, 1992 (2nd ed., p. 277)), the following comments are made:

"If you want to generate a random integer between 1 and 10, you should always do it by using high-order bits, as in

j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

and never by anything resembling

j = 1 + (rand() % 10);

(which uses lower-order bits)."

(c) man rand

Deleted
()
Ответ на: комментарий от true_admin

>На сколько вообще rand() хорош как источник случайных данных?

возьми и проверь в R много тестов разных

anonymous
()
Ответ на: комментарий от true_admin

>> На сколько вообще rand() хорош как источник случайных данных?

Как источник _случайных_ данных он вообще никуда не годится =). rand() - это
 генератор псевдослучайных данных.

В большинстве случаев rand() реализован примерно вот так (из man rand
опять же):

static unsigned long next = 1;

/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}

void mysrand(unsigned seed) {
    next = seed;
}

Deleted
()
Ответ на: комментарий от true_admin

зависит от seed что было задано в srand(seed)

стандартно - системное время, pid, uid, gid, время старта системы... какие нибудь еще там данные, вроде места на диске и т п..

оптимальнее - взять еще кусочек с /dev/random (или /dev/urandom что чуть хуже)

Sylvia ★★★★★
()
Ответ на: комментарий от Deleted

The versions of rand() and srand() in the Linux C Library use the  same
random number generator as random(3) and srandom(3), so the lower-order
bits should be as random as the higher-order bits.

Из man rand опять же. :) На таких реализациях с псевдослучайностью не
так уж всё и плохо. :) Хотя, конечно, серьезный тест на случайность и
он скорее всего не пройдет.

twosev ★★
()
Ответ на: комментарий от Sylvia

Сид никоим образом не определяет качество генератора rand() и случайность получаемых им данных. :) Силу генератора определяет собственно алгоритм генерации, а не входные данные, а rand() и random() - емнип, простенькие конгруэнтные генераторы. :) Так что не нужно ждать от них стабильно хорошего выхода. А перечисленные параметры типа времени, пида, уида и пр. - просто для того, чтобы от теста до теста не повторялся результат генерации. :)

twosev ★★
()
Ответ на: комментарий от twosev

>> Из man rand опять же. :) На таких реализациях с псевдослучайностью не так уж всё и плохо. :) Хотя, конечно, серьезный тест на случайность и он скорее всего не пройдет.

В любом случае - это не гарантировано.

Deleted
()
Ответ на: комментарий от Deleted

> В любом случае - это не гарантировано.

в линухах man гарантирует :)

true_admin ★★★★★
()
Ответ на: комментарий от twosev

> Сид никоим образом не определяет качество генератора rand() и случайность получаемых им данных. :) Силу генератора определяет собственно алгоритм генерации, а не входные данные, а rand() и random() - емнип, простенькие конгруэнтные генераторы. :) Так что не нужно ждать от них стабильно хорошего выхода. А перечисленные параметры типа времени, пида, уида и пр. - просто для того, чтобы от теста до теста не повторялся результат генерации. :)

Выпендрился? Доволен? Молодец.
Это и так все понимают.

anonymous
()
Ответ на: комментарий от true_admin

gcc'овый rand() -- весьма и весьма крутой генератор. Им где только не пользуются.

balodja ★★★
()
Ответ на: комментарий от anonymous

В основе glibc rand() и random() лежит некоторая модификация LFSR'ов.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.