О случайности и культуре дискуссий ID:48353 |
Сб, 1 сентября 2001 00:00 [#] [») |
|
|
Всем привет!
Смотрю я на последние разборки и диву даюсь.
Нет, не тому, что один кроет другого по чёрному,
а реакции некоторых товарищей в стиле:
"Опомнитесь! Что вы делаете!".
Да боже мой, чего вы так напугались?
Ну, назвали кого-то "кретином", а тот в ответ
запустил "дебила", ну и что?
Зато как оживилась переписка.
Сколько было высказано мнений, которые иначе
их авторы оставили бы при себе. Как выпукло
прорисовались характеры некоторых участников.
Не так уж сложно отделить мусор от содержания.
Может я и не прав, но по-моему самые конструктивные
дискуссии ведутся как раз в стиле взаимных нападок,
а корректность хороша тогда, когда человек
на самом деле хочет сказать как можно меньше.
Во всяком случае, меня можете ругать сколько угодно,
хоть матом, я займусь не заламыванием рук, а попробую
подогреть свой ответ до той же температуры.
А ругать, похоже, будет за что, так как у меня
снова "крамольные" идеи.
Там затронули тему датчиков случайных чисел,
и я хотел бы на ней задержаться.
Во-первых, я не понял, почему четырёхбайтовый генератор
должен зациклиться именно после 2^14 вариантов?
То, что зациклится - спору нет, если следующее число
определяется предыдущим (или несколькими предыдущими),
то как только все варианты будут исчерпаны,
последовательнось обязана повториться. А бесконечностей
на практике не бывает. Удивило странное число 2^14.
Это, кстати, всего 16000 с небольшим, маловато как-то.
Тип long даёт 4 миллиарда. Кнута я читал давно, но вроде
он как раз обсуждает такой выбор параметров, при котором
датчик даёт все возможные значения. Ну, или ОЧЕНЬ много,
точно не помню. Правда там же есть предупреждение,
что младшие биты ведут себя хуже старших, так что
лучше их отбросить. Но ведь от этого датчик быстрее
не зациклится, так как теперь будет возможен например
вариант (..., 3, 7, ...., 3, 10, ...). И, кстати,
странно, что никто не удосужился процитировать
какие-нибудь исходники. Берём к примеру MSVC 6.0:
/*
static long holdrand = 1L;
return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
*/
Типа, классика: (A * R + B) mod C.
В качестве C неявно выбрано число 2^32, оптимизаторы хреновы.
Это настораживает, вроде как раз таких вариантов
Кнут советовал избегать. Но зацикливаться после 2^14 этот
датчик отнюдь не обязан. Хотя, от Microsoft всего можно
ожидать - неплохо бы самому выяснить, какой тут период.
Однако, как мне кажется, проблема может заключаться не столько
в длине периода, сколько в недостаточной дисперсии.
В самом деле, если датчик обязан пробегать ограниченную
область значений, то по мере исчерпания этой области
дисперсия начнёт убывать, и какие будут последствия
для симулятора я предсказать не берусь.
Да и потом, само понятие "случайности" скорее интуитивное,
чем математическое. Когда последовательность можно
считать случайной? Когда она проходит статистические тесты
на выявление закономерностей. Таких тестов полным-полно,
и уже одного этого факта достаточно, чтобы понять,
что ясного ответа на поставленный вопрос не будет.
Последовательность может с блеском выдержать один тест
и полностью засыпаться на другом. И даже если она прошла
все известные тесты, нет никакой гарантии, что закономерность
всё-таки есть, просто её не удалось выявить.
Хорошо, давайте возьмём аппаратный датчик.
Тут я полный дилетант, но рискну сделать пару предположений.
Во-первых, схему, где на вход счётчика подан сигнал
с высокочастотного генератора, вряд ли можно назвать
приемлимой. Что такое высокая частота? 1 ГГц? Так программа
будет опрашивать датчик с частотой десятки, а может и сотни
килогерц. Не так уж и много остаётся. Кроме того, частота
процессора стабилизирована, так что сами запросы будут
достаточно регулярными. Вот наложатся два периодических
процесса и получим мы картину биений вместо рандома.
Вроде ещё бывают релаксационные генераторы, где колебания
неустойчивы. Но где гарантия, что это не иллюзия, не сумма
нескольких регулярных колебаний? Может, прогнать данные
такого генератора через набор статистических тестов?
Здрасте - приехали.
Хотели устроить истинно случайный генератор,
а получили лишь очередную загадку.
Окей, не будем мелочиться.
Берём кусок урана и засовываем его в слот PCI.
Этот-то хоть даст случайные значения?
Современная физика говорит - хрен его знает.
Во всяком случае, статистические тесты - за.
Но как практически подойти?
Считать число распадов в секунду?
Ну, положим, надо бы в микросекунду, и должно их быть
хотя бы тыщ сто, а иначе как получить вероятность 10E-5?
Такой датчик, пожалуй, заставит задуматься о потенции,
разве что спрятать его за свинцовой плитой.
И ещё: радиоактивность со временем будет падать,
а надо же не только избежать закономерности,
но и знать нормировку. А то получится, что в понедельник
симулятор обещает +1.5%, во вторник только 1.3%,
а к концу недели начинает проигрывать.
Бог с ним, со всеми этими сложностями,
пусть у нас ЕСТЬ истинно случайный генератор,
что бы это не значило.
Запускаем его, получаем +1.5% для результата,
закладываем квартиру и идём в казино.
И с ужасом видим, что процесс тасования карт не только
не случаен, он вызывающе не случаен!
Шлёп, шлёп, делайте ваши ставки, господа.
Один пример я уже приводил, наверняка есть и другие.
Итак: с одной стороны теория, с другой - практика.
Вот и чудесно, сейчас выясним, правы мы были, или нет.
Но позвольте, каким образом?
В казино пускают с 18 лет,
а маразм начинается (допустим) в 80.
Спать надо часов 8, ещё 8 уйдет на всякие дела,
вычитаем-умножаем и получается, что за всю жизнь
человек успеет сыграть где-то 50 миллионов ставок.
Это в предельном случае, реально же намного меньше.
Да и правила постоянно меняются, так что даже 1 миллион
это оптимистичный прогноз.
У меня, например вряд ли было 50 тысяч.
Дисперсия на такой выборке составляет десятые процента,
то есть сравнима с ожидаемым результатом.
Я ещё раз спрашиваю - где гарантия, что расчёты
действительно предсказывают настоящий результат,
а не всего лишь похожий.
Если некто X выиграл, а Y проиграл - это неоспоримый факт.
Если X играет строго БС, а Y регулярно берёт карту на 20,
то в этом нет ничего удивительного, я и без всяких расчётов
скажу, что так оно и будет (хотя, бывают такие
гримасы судьбы, что руки опускаются .
Но вот теперь X освоил вдобавок счёт карт и надеется
улучшить свой результат. На сколько? На помощь приходят
расчёты. Допустим, на 1%. Ну что ж, где-то через 10000
ставок можно надеяться это почувствовать. Хотя лучше бы
поиграть подольше, чтобы колебания упокоились.
Скажем, через 100000 ставок в нашем кармане дополнительно
осядет...
Стоп.
Я вот и 50000 ещё не сыграл, да и ошибочки иногда
проскакивают, да и точный учёт денег вести сложно,
то выпьешь лишнего, то забудешь, сколько на чай дал,
то на курсе потеряешь, то в ресторан зарулишь.
Одним словом, я не вижу способа проверить, согласуется
ли теория с практикой.
Очевидно, что БС лучше, чем игра от балды.
Но относительно систем счёта - не уверен.
Математически там всё в порядке, но математически
майский жук летать не должен, а вот летает.
Может быть, реально счёт карт - это вроде астрологии?
Например, прогноз: Луна в Меркурии, Солнце в Уране,
бла-бла-бла, в четверг деловые встречи лучше отменить,
а во вторник - самое то. Человек следует этим рекомендациям,
и правда, дело выгорело. Но как же теперь проверить,
что бы случилось в четверг? Может было бы ещё лучше?
А если астролог услышал по радио, что на четверг обещают
дождь со снегом, может с таким прогнозом действительно
стоило считаться. Вымок бы, опоздал, вот и неудача.
Ладно, вы уже устали всю эту муть читать
Мое мнение: смысл счёта карт недостаточно обоснован.
Может на практике он помогает, а может и нет.
Я пока не буду напрягаться.
P.S.
Ещё пару слов - о полном переборе. Типа, раз результаты
моделирования совпадают с результатами перебора, то оба
метода правильны. Друзья - совпадают две математические
модели. Что происходит с реальной колодой в руках реального
крупье - кто его знает.
И, тем не менее, удачи всем: и счётчикам и ... не-счетчикам!
P.P.S.
|
|
|