Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Random глючит... [D6, Win95/98, WinXP]


Страницы:   1 2 3

_vitek_ ©   (2003-01-25 02:56:00) 

Может кто сталкивался с проблемой генерирования случайных чисел... у меня они какие-то не случайные получаются ...
Пишу random(x) ... далее в проге идёт всяческая обработка ...
при запуске программы повторно, чила, зависящие от random-a те же.. В чём может быть проблема?


uw   (2003-01-29 17:36:00) [1]

А "Заменя пробелов" нас победила...


Dms   (2003-01-29 16:34:00) [2]

Вот-вот, не всегда же после 75 идет 12345 :)


han_malign   (2003-01-29 16:24:00) [3]

Понял я ваши непонятки - при обрубании регистра по диапазону {Random(Max)} выходное 75 может получиться из разных значений регистра и повторение последовательности 75-12345 гарантированно произойдет только после выборки 2^32 Random-ов(хотя может и раньше, зависит от Max)...


uw   (2003-01-29 16:09:00) [4]

Караул.


Dms   (2003-01-29 16:06:00) [5]

Да ты что ? Неужели по твоему 75 можно получить только одним путем ? Таким, что если продолжить, то получится 12345 ... Если это так то почитай учебник 5го класса.
Если совсем времени не жалко - напиши простенькую программу и увидишь, что если a[i] = a[j], то из этого не следует, что ОБЯЗАТЕЛЬНО a[i+1] = a[j+1]


uw   (2003-01-29 15:54:00) [6]

>внутри этого цикла после 75 может идти что угодно, а не только 12345

Dms, я все понял - у тебя глючит комп!


Dms   (2003-01-29 15:24:00) [7]

вот это не так !!! я имел ввиду это утверждение, цикл длиной 2^32 пусть будет (это недостаток искусственных генераторов), но внутри этого цикла после 75 может идти что угодно, а не только 12345.


han_malign   (2003-01-29 15:20:00) [8]

если один раз было "после 75 - 12345" то это будет всегда...


uw   (2003-01-29 15:19:00) [9]

>Dms

Выдаст!
Генераторы устроены примерно так. Есть внутренний регистр, например, 4-байтный. Randomize некоторым образом его инициализирует. Потом при каждом обращении к Random над этим регистром проделываются некоторые определенные манипуляции типа сдвига и XOR"а над определенными битами. Этот регистр однозначно отображается на заданный отрезок Range, и Random возвращает результат. Регистр, очевидно, имеет цикл, а вместе с ним и результирующая последовательность.
Когда я говорил, что "присутствует ровно 1 раз", то подразумевал последовательность значений регистра. Но статистические характеристики обеих последовательностей по сути одинаковы.


han_malign   (2003-01-29 15:17:00) [10]

>RANDOM никогда не выдаст циклическую последовательность, неважно какой у него там регистр !

У Random - 32 битный регистр и если раз в милисекунду брать его значение - то через 49.7... дней мы выйдем на второй круг циклической последовательности...

system.pas
procedure _RandInt;
asm
{ ->EAX Range }
{ <-EAX Result }
IMUL EDX,RandSeed,08088405H
INC EDX
MOV RandSeed,EDX
MUL EDX
MOV EAX,EDX
end;


Dms   (2003-01-29 15:16:00) [11]

Это понятно, иначе был бы идеальный вариант. Но было сказано, что после 75 всегда будет 12345. Это-то полный бред.


Digitman   (2003-01-29 15:10:00) [12]

>Dms

Выдаст. Результирующий "белый шум" не имеет ничего общего с алгоритмом генерации, базирующемся на 64-разр. значениях

procedure _RandInt;
asm
{ ->EAX Range }
{ <-EAX Result }
IMUL EDX,RandSeed,08088405H
INC EDX
MOV RandSeed,EDX
MUL EDX
MOV EAX,EDX
end;

рано или поздно результирующая последовательность произведений в EDX:EAX повторится


Dms   (2003-01-29 14:54:00) [13]


> Это следует из того, что если мы начали с числа 75 и после
> него получили 12345, а потом где-то опять увидели 75, то
> будьте уверены, что после него будет 12345

Не буду уверен !!! Это полная неправда, можно проверить самому на практике, но нелепость видна и так. RANDOM никогда не выдаст циклическую последовательность, неважно какой у него там регистр !


uw   (2003-01-29 14:41:00) [14]

>Dms (29.01.03 14:36)
Это следует из того, что если мы начали с числа 75 и после него получили 12345, а потом где-то опять увидели 75, то будьте уверены, что после него будет 12345.
А Random выдает равномерное распределение.


Dms   (2003-01-29 14:36:00) [15]


> Хороший генератор псевдослучайных чисел и в самом деле дает
> равномерное распределение

Это правильно.


> Более того, если его рабочий регистр 32-битный, то он гарантирует
> нециклическую последовательность длиной примерно 2^31.
> Вот мы получили такую последовательность и видим, что в
> ней каждое число от 1 до 2^31 присутствует ровно 1 раз

Полная охинея. Откуда такие утверждения ? Если последовательност нециклическая, это не означает, что в ней числа все разные. Да и вообще, на основании чего можно говорить, что RANDOM выдает неравномерное распределение, т.е. является ГЛЮЧНЫМ ?


Anatoly Podgoretsky   (2003-01-29 14:21:00) [16]

Но хотелось бы увидеть все таки пример глюка.


Anatoly Podgoretsky   (2003-01-29 14:20:00) [17]

Так тебе нужен генератор реальных случайных чисел, чего же ты требуешь этого от Random


uw   (2003-01-29 14:15:00) [18]

>Юрий Зотов © (28.01.03 16:42)

>1. При чем тут отрезок в 32 бита - лично я так и понял

Хороший генератор псевдослучайных чисел и в самом деле дает равномерное распределение, кто против! Более того, если его рабочий регистр 32-битный, то он гарантирует нециклическую последовательность длиной примерно 2^31. Вот мы получили такую последовательность и видим, что в ней каждое число от 1 до 2^31 присутствует ровно 1 раз. Это и не соответствует никакой реальности.
В частности, если мы применим "не помню чью теорему" (han_malign © (28.01.03 13:08)), то выяснится, что для нашего генератора она не работает.
Только на это я и намекал в предыдущем своем эссе.


Dms   (2003-01-28 17:09:00) [19]

Если кому-то захотелось АБСОЛЮТНО случайную величину, и Randomize не устраивает - попросите юзера поводить мышкой по экрану в течении 5 секунд, да еще помножте на число милисекунд прошедших с рождества христова. Последовательность будет АБСОЛЮТНО случайная. (конечно с некоторой натяжкой), но,
случайнее НИЧЕГО не получите (без использования спецтехники). Еще вариант - снимать звук со старых саундбластеров (там шипение небольшое даже слышно) - вот это и есть "белый шум" - САМАЯ случайная последовательность в природе.


Юрий Зотов   (2003-01-28 16:42:00) [20]

> Dms (28.01.03 16:12)
И даже, IMHO, довольно сильно погорячился.

1. При чем тут отрезок в 32 бита - лично я так и понял.
2. От Random требуется только одно - чтобы она давала ТОЧНО то, что сказано о ней в документации. Она именно это и делает.
3. А в документации сказано, что Random дает равномерное распределение. Она именно для этого и написана. Почему вдруг кто-то решил потребовать от нее чего-то другого - непонятно. Почему вдруг это стало каим-то недостатком - тоже непонятно. С таким же успехом можно возмущаться тем, что функция StrToInt не выключает монитор, а пароходы не летают по небу.

Для тех, кто не в курсе.

Во всех языках программирования основной ДСЧ - это именно равномерный ДСЧ. Потому что на его основе программист может сам получить числа с нужным ему распределением, алгоритмы для этого хорошо известны, обоснованы теоретически и пр. Но не наоборот.

Вот именно поэтому Random и сделана, как равномерный генератор. И свое дело она делает, уверяю Вас, очень даже неплохо. Но только СВОЕ, а не ЧУЖОЕ. И не надо требовать от нее того, чего она и не должна делать.

А кому нужен Гаусс - так в Delphi он тоже есть. Только при чем здесь Random - непонятно. Вы же не требуете от парохода, чтобы он по небу летал?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо