Re[6]: rand > RAND_MAX
От: _DAle_ Беларусь  
Дата: 25.08.10 10:41
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, _DAle_, Вы писали:


_DA>>Потому что значение, возвращаемое rand, однозначно определяется предыдущим значением.


A>Вы хотите сказать нам, что rand() выдает коррелированные значения?


Я хочу сказать, что в линейном конгруэнтном методе псевдослучайное значение получается из предыдущего.
Re[7]: rand > RAND_MAX
От: rg45 СССР  
Дата: 25.08.10 11:14
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>Здравствуйте, Abyx, Вы писали:


A>>Здравствуйте, _DAle_, Вы писали:


_DA>>>Потому что значение, возвращаемое rand, однозначно определяется предыдущим значением.


A>>Вы хотите сказать нам, что rand() выдает коррелированные значения?


_DA>Я хочу сказать, что в линейном конгруэнтном методе псевдослучайное значение получается из предыдущего.


Ну и что, это всего навсего деталь реализации псевдослучайной последовательности чисел. Это вовсе не означает, что каждый раз после выпадения некоторого числа X следующим всегда будет выпадать одно и то же число Y. При решении большинства практических задач мы вполне можем считать эти числа случайными и равновероятными. То же самое можно сказать и последовательно выпадающих парах чисел — вероятности выпадения различных пар чисел тоже можно считать равными.
--
Справедливость выше закона. А человечность выше справедливости.
Re[8]: rand > RAND_MAX
От: _DAle_ Беларусь  
Дата: 25.08.10 11:26
Оценка:
Здравствуйте, rg45, Вы писали:

A>>>Вы хотите сказать нам, что rand() выдает коррелированные значения?


_DA>>Я хочу сказать, что в линейном конгруэнтном методе псевдослучайное значение получается из предыдущего.


R>Ну и что, это всего навсего деталь реализации псевдослучайной последовательности чисел. Это вовсе не означает, что каждый раз после выпадения некоторого числа X следующим всегда будет выпадать одно и то же число Y. При решении большинства практических задач мы вполне можем считать эти числа случайными и равновероятными. То же самое можно сказать и последовательно выпадающих парах чисел — вероятности выпадения различных пар чисел тоже можно считать равными.


Не означает, но на практике в большинстве случаев так и будет. Поэтому такой способ будет не сильно лучше rand() * (double)NEW_RAND_MAX / RAND_MAX. А уж дальше пускай каждый сам решает, достаточно ли ему такой случайности или нет.
Re[7]: rand > RAND_MAX
От: Abyx Россия  
Дата: 25.08.10 12:24
Оценка: +1
Здравствуйте, _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() никак не связаны.
In Zen We Trust
Re[4]: rand > RAND_MAX
От: Abyx Россия  
Дата: 25.08.10 12:33
Оценка: 4 (1)
Здравствуйте, Кодёнок, Вы писали:

Кё>Нельзя. Диапазон хоть и стал XRAND_MAX, количество всех возможных чисел остается равным RAND_MAX. С тем же успехом мог просто умножить на константу.


int32 seed;
int32 RAND_MAX = 0xFFFF;
int32 rand()
{
    seed = seed * A + B;
    return seed % (RAND_MAX + 1);
}

int32 rand2()
{
   return rand() + rand() * (RAND_MAX + 1);
}


подставляем rand в rand2, получаем
int32 rand2()
{
    seed = seed * A + B;
    return seed;
}

значит rand2 может вернуть RAND_MAX * RAND_MAX значений. ч.т.д.

Да, это зависит от реализации стандартной библиотеки.
Да, стандартные библиотеки gcc и msvc реализованы примерно одинаково и в них этот код будет работать.
Да, для то чтобы не быть привязанным к конкретным библиотекам лучше написать свою rand(), пример кода я уже приводил.
In Zen We Trust
Re[8]: rand > RAND_MAX
От: _DAle_ Беларусь  
Дата: 25.08.10 12:53
Оценка:
Здравствуйте, 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.
Re[9]: rand > RAND_MAX
От: Abyx Россия  
Дата: 25.08.10 14:41
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>Согласен, почему-то рассматривал только вариант с seed и RAND_MAX одинаковой разрядности. Но вроде бы такое тоже не редкость, в g++, например, RAND_MAX равен 2^31-1.


у меня в gcc 4.5
#define    RAND_MAX    0x7FFF


Впрочем если бы у ТСа RAND_MAX был бы равен 2^31-1, он скорее всего не создал бы такую тему
In Zen We Trust
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.