Здравствуйте, _DAle_, Вы писали:
_DA>Здравствуйте, Abyx, Вы писали:
A>>Здравствуйте, _DAle_, Вы писали:
_DA>>>Потому что значение, возвращаемое rand, однозначно определяется предыдущим значением.
A>>Вы хотите сказать нам, что rand() выдает коррелированные значения?
_DA>Я хочу сказать, что в линейном конгруэнтном методе псевдослучайное значение получается из предыдущего.
Ну и что, это всего навсего деталь реализации псевдослучайной последовательности чисел. Это вовсе не означает, что каждый раз после выпадения некоторого числа X следующим всегда будет выпадать одно и то же число Y. При решении большинства практических задач мы вполне можем считать эти числа случайными и равновероятными. То же самое можно сказать и последовательно выпадающих парах чисел — вероятности выпадения различных пар чисел тоже можно считать равными.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
A>>>Вы хотите сказать нам, что rand() выдает коррелированные значения?
_DA>>Я хочу сказать, что в линейном конгруэнтном методе псевдослучайное значение получается из предыдущего.
R>Ну и что, это всего навсего деталь реализации псевдослучайной последовательности чисел. Это вовсе не означает, что каждый раз после выпадения некоторого числа X следующим всегда будет выпадать одно и то же число Y. При решении большинства практических задач мы вполне можем считать эти числа случайными и равновероятными. То же самое можно сказать и последовательно выпадающих парах чисел — вероятности выпадения различных пар чисел тоже можно считать равными.
Не означает, но на практике в большинстве случаев так и будет. Поэтому такой способ будет не сильно лучше rand() * (double)NEW_RAND_MAX / RAND_MAX. А уж дальше пускай каждый сам решает, достаточно ли ему такой случайности или нет.
Здравствуйте, _DAle_, Вы писали:
_DA>Я хочу сказать, что в линейном конгруэнтном методе псевдослучайное значение получается из предыдущего.
Оно получается не из предыдущего, а из seed. Посмотрите внимательно на код rand(). Возвращается log2(RAND_MAX + 1) разрядов seed, по этому никакого однозначного соответствия между двумя последовательными результатами rand() нет.
Для 32 разрядного seed возможны 2^(32-log2(RAND_MAX + 1)+1) пар последовательных значений. Для log2(RAND_MAX + 1) = 16 это означает что два последовательных результата rand() никак не связаны.
Здравствуйте, Кодёнок, Вы писали:
Кё>Нельзя. Диапазон хоть и стал XRAND_MAX, количество всех возможных чисел остается равным RAND_MAX. С тем же успехом мог просто умножить на константу.
значит rand2 может вернуть RAND_MAX * RAND_MAX значений. ч.т.д.
Да, это зависит от реализации стандартной библиотеки.
Да, стандартные библиотеки gcc и msvc реализованы примерно одинаково и в них этот код будет работать.
Да, для то чтобы не быть привязанным к конкретным библиотекам лучше написать свою rand(), пример кода я уже приводил.
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, _DAle_, Вы писали:
_DA>>Я хочу сказать, что в линейном конгруэнтном методе псевдослучайное значение получается из предыдущего.
A>Оно получается не из предыдущего, а из seed. Посмотрите внимательно на код rand(). Возвращается log2(RAND_MAX + 1) разрядов seed, по этому никакого однозначного соответствия между двумя последовательными результатами rand() нет. A>Для 32 разрядного seed возможны 2^(32-log2(RAND_MAX + 1)+1) пар последовательных значений. Для log2(RAND_MAX + 1) = 16 это означает что два последовательных результата rand() никак не связаны.
Согласен, почему-то рассматривал только вариант с seed и RAND_MAX одинаковой разрядности. Но вроде бы такое тоже не редкость, в g++, например, RAND_MAX равен 2^31-1.
Здравствуйте, _DAle_, Вы писали:
_DA>Согласен, почему-то рассматривал только вариант с seed и RAND_MAX одинаковой разрядности. Но вроде бы такое тоже не редкость, в g++, например, RAND_MAX равен 2^31-1.
у меня в gcc 4.5
#define RAND_MAX 0x7FFF
Впрочем если бы у ТСа RAND_MAX был бы равен 2^31-1, он скорее всего не создал бы такую тему