![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Random глючит... [D6, Win95/98, WinXP]
_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 - непонятно. Вы же не требуете от парохода, чтобы он по небу летал?