Текстовая версия форума CASINOBOARD << полная версия страницы
Офлайн-казино / Блэкджек / Считаем БС....
ЗилОн
Считаем БС.... [ID=45612]
Пт, 16 августа 2002 00:00 [#]
Добрый день, уважаемые господа!
Недавно начал сам программировать. Пока удалось повторить "Таблицу различных исходов при наборе карт дилером" из книжки Лесного. А теперь вопрос.
Захотелось посчитать, например, брать или не брать на 13 против 8. Мысль такая: так как БС не известна(мы её считаем) придётся рассмотреть варианты
1/13 - приходит туз и снова считать брать/не брать 14 пр.8
,,,,,
4/13 - приходит 10 -> перебор.

Получается рекурсия как в функции факториал
F(n) = n*F(n-1) F(1)=1

Если не сложно, поправьте меня или поделитесь опытом.
Спасибо.
ЗЫ Можно мылом.
Kerjo
Re: Считаем БС.... [ID=45614] [ответ на 45612 ()]
Пт, 16 августа 2002 00:00 [#]
Если я правильно понял ...

Начни с конца. "Заложи" базовую стратегию, согласно которой игрок набирает всегда до тех пор
пока у него не станет 21. Посчитай MO при всех возможных вариантах у дилера. Отступи на шаг -
пусть теперь игрок набирает всегда до 20. Опять посчитай МО. И т. д. Таким образом найдешь
оптимальную стратегию против каждой карты дилера.

Даблы и сплиты просчитаешь после того, как "нащупаешь" основную стратегию.

Я, правда, поступил несколько иначе - сразу заложил "правильную" БС, чтобы "скакать" от нее в
разные стороны.

Лично у меня возникла проблема с алгоритмизацией сплитования. Вначале даже хотел сделать
рекурсию. Но потом стало лень искать "образец" (С++ 'ом пользуюсь второй раз в жизни) и в
результате обошелся без рекурсии.

Я уж было сам дописал свой симулятор, но пришло лето и ...

Как доделаешь, свистни, сравним результаты.
Pan Votruba
Считаем БС... - Самостоятельно! [ID=45617] [ответ на 45614 ()]
Пт, 16 августа 2002 00:00 [#]
> Начни с конца. "Заложи" базовую стратегию, согласно которой игрок набирает
> всегда до тех пор пока у него не станет 21. Посчитай MO при всех возможных
> вариантах у дилера. Отступи на шаг - пусть теперь игрок набирает всегда до 20.
> Опять посчитай МО. И т. д. Таким образом найдешь оптимальную стратегию
> против каждой карты дилера.

"Самая кортокая дорога та, которую знаешь!" (с)

Kerjo, трудности были (имхо) за год с лишним до выхода книг Лесного. Инфы было мало и все
тесты приходилось разрабатывать самому (самим точнее!)... Сейчас проще, есть масса
контрольных цифр и практически любой бонус УЖЕ кем-то считался, не говоря о
распостроненных правилах.
Предложенные тобой алгоритмы (идеи) не смые короткие; долгой дорога к БС покажется. Ео
главное - чтобы хоть какой-то вариант заработал правильно.

Удачи!
ПВ
З.Ы. Всем програмерам желаю самостоятельно преодолеть трудности! Для ориентира: вся БС
(правила произвольные) считается менее чем за 0.1 сек на Цел-600...
HECTOP
Re: Считаем БС... - Самостоятельно! [ID=45619] [ответ на 45617 ()]
Пт, 16 августа 2002 00:00 [#]
"Не боги горшки обжигают"

Разберемся Smile
Естественно когда есть контрольные цифры, все намного проще.
Хотя книга Лесного мне показалась не очень, даже слова не подберу.
Академичности в ней мало что ли. Лично я люблю полные и подробные математические
выкладки. А то как в институте было: "Не трудно видеть что из формулы 3 следует 4" А меду ними
два листа выкладок Smile
А про скорость современных компов и говарить не приходится. Все очень быстро. Если уж только
сильно криво прогу не напишешь Smile (Да и то это надо еще очень постараться)
HECTOP
Re: Считаем БС.... [ID=45620] [ответ на 45612 ()]
Пт, 16 августа 2002 00:00 [#]
Привет всем.
А я вот тоже начал изучать BJ. Надоели онлайновые игры (проблемы выигрыши вывести).
Решил попытатья в реале. Но прежде чем соваться играть решил погрузиться в математику.
Второй день уже пытаюсь воспроизвести указанную тобой табличку из Лесного.
Мозги скрепят Smile Теовер вспомнил. Пишу на VBA в Excel-ке (чтоб проще и быстрее, да и опыт
прогрмирования там большой). Алгоритмики оказываются не простые в смысле весьма
разветвленные. Ну ничего справимся. Уж если в сапера штуку баксов выиграли, то и BJ одолеем Smile
HECTOP
Про алгоритмы [ID=45621] [ответ на 45620 ()]
Пт, 16 августа 2002 00:00 [#]
Я так понимаю, что чисто средствами тервера в лоб посчитать вероятности не получается, а
придется перебирать все возможные цепочки карт и анализировать их в разветвленном
алгоритме.
ЗилОн
Re: Считаем БС.... [ID=45629] [ответ на 45612 ()]
Пн, 19 августа 2002 00:00 [#]
Добрый вечер!
Вы будете смеятся, но для того, чтобы посчитать БС пришлось заново переписать код.
...И сразу разочарование. Контрольный пример: берём против туза.
Значения среднего выигрыша(проигрыша) на стр. 154 книги Лесного совпадают для 20, 19,18
А дальше фигня:
для 11 у меня ~ -22.7
для 10 у меня ~ -22.7 (в пределах погрешности*)
для 9 у меня ~ -34.75
для 9 у меня ~ -41.6

*погрешность может возникнуть из-за того, что вероятности набора дилером с туза я забил из
книжки. То есть {17,18,19 - 13.08 и т.д.)

Я считал так. Предположим, у игрока 20 очков, а у дилера туз. Делаем серию экспериментов -
в одном случае берём, в другом нет. Выясняется, что брать невыгодно. Поэтому, ЕСЛИ на 19
наберём 20, то НЕ БЕРЁМ. Может тут ошибка? Я предполагаю, что это функция непрерывна,
однако уже на 11 следует всплеск Smile))



Мне очень интересен алгоритм, по которому считали Вы. Как Вы программировали игрока, его
действия?

ЗЫ Выкладываю кусочек кода, дабы не быть голословным.

class Igrok {
public:
Igrok();
Igrok(int opr_summa_o4kov); //&ograve;&egrave;&iuml;&agrave; &oacute;&aelig;&aring; &atilde;&icirc;&ograve;&icirc;&acirc;&ucirc;&eacute;
// Igrok(int karta1, int karta2); //&ograve;&egrave;&iuml;&agrave; &oacute;&aelig;&aring; &atilde;&icirc;&ograve;&icirc;&acirc;&ucirc;&eacute;


int kolvo_kart; ///&ecirc;&icirc;&euml;&egrave;&divide;&aring;&ntilde;&ogr ave;&acirc;&icirc; &ecirc;&agrave;&eth;&ograve; &Acirc;&ntilde;&iuml;&icirc;&igrave;&icirc;&atilde;&agrave ;&ograve;&aring;&euml;&uuml;&iacute;&agrave;&yuml; &acirc;&aring;&euml;&egrave;&divide;&egrave;&iacute;&agrav e;
int summa_o4kov; ///&ecirc;&icirc;&euml;&egrave;&divide;&aring;&ntilde;&ogr ave;&icirc;&acirc; &icirc;&divide;&ecirc;&icirc;&acirc;
int nabor[16];

//double veroyatnocti[7];
// // 17, 18, 19, 20, 21,BJ, &iuml;&aring;&eth;&aring;&aacute;&icirc;&eth;
int zest_myag; //bool
int perebor;

void vzyat_karty();
int* cdelat_nabor();
};
ЗилОн
Re: Считаем БС.... [ID=45633] [ответ на 45612 ()]
Пт, 23 августа 2002 00:00 [#]
Нда...книжка Лесного преподносит всё больше и больше сюрпризов. Я решил проверить
стратегию удвоения. В-принципе, для подсчёта "выгодности" программирование не нужно.
Достаточно калькулятора. Идея такая. Есть вероятности набора определённого кол-ва очков
дилером и соотвветсвенно, такое же распределение можно получить для игрока на дабле. (Карта
берётся ВСЕГО ОДНА, всего 13 вариантов Smile ). Далее считаем так. Пусть игрок набирает меньше
17 - тогда он проиграет в случае, если дилер наберёт 17,18....21 и выиграет, если дилер уйдёт.
Если у игрока 17 - он проиграет, только если у дилера 18 - 21 и выиграет, если у дилера перебор.
Надеюсь алгоритм понятен. Так вот, в очень многих случаях (10,11 vs 7 и выше) у меня Дабл не
проканывет. Один раз пересчитал вручную Sad(((
Какие будут соображения?

ЗЫ Очень хотелось бы поделится именно програмистскими штучками. Как Вы алгоритмизируете
игру? Как представляете колоду? (у меня пока бесконечная)
Выкладываю кусочек кода, чтобы было о чём поговорить....

функция набора карт игроком

int* Igrok::cdelat_nabor()
{
do{
vzyat_karty();

summa_o4kov = 0;
for (int i=0; i<16; & &aring;&ntilde;&ograve;&uuml; &ograve;&oacute;&ccedil; (nabor[i]== (summa_o4kov (summa_o4kov+10) (zest_myag== + /// 1 1) 10; 17); < i++) if nabor[i]; summa_o4kov=summa_o4kov zest_myag=1; { } }while> 21)
perebor = 1;
return nabor;
}

Простейший вариант. Я пока не знаю, как считать таблицу и как её использовать....
Pan Votruba
Re: Считаем БС.... [ID=45634] [ответ на 45633 ()]
Пт, 23 августа 2002 00:00 [#]
>> Так вот, в очень многих случаях (10,11 vs 7 и выше) у меня Дабл не
>> проканывет. Один раз пересчитал вручную Sad(((
>> Очень хотелось бы поделится именно програмистскими штучками.
>> Как Вы алгоритмизируете игру?
ЗилОн, может ты просто не своим делом занимаешься??... -)
Подумай о смене амплуа (без ехидства сказано).

Начинать надо не свопросов, а споиска - "blackjack + soft/program". С пяток версий ОТКРЫТОГО
кода на паскале, С, С++ находится сразу. Пусть они буржуйские, но не можешь сам сообразить -
разбирайся в чужом.

Следующий шаг - набор карт дилером. Всё должно от зубов отскакивать! Далее - игрок (все
стадии игры); потом - экзотические бонусы.

По осени (поищи!) выкладывал на С функцию набора карт дилером.

Удачи!
ПВ
ЗилОн
Re: Считаем БС.... [ID=45642] [ответ на 45612 ()]
Вт, 27 августа 2002 00:00 [#]
2 Pan Votruba
Спасибо за Ваши советы, но пока они мало помогают Wink

Итак, я, последовава совету Kerjo решил не изобретать велосипед, а "забить" готовую базовую
стратегию, предварительно её ПРОВЕРИВ. Рассуждаем так:
1) Берём произвольную карту дилера.
2) Рассматриваем первые 2 карты игрока и подсчитываем очки. На 21 "взять" не удасться Smile
Переходим к [кол-ву очков -1] ( в данном случае к 20)
3) Сравниваем два МО: первое, когда берём карту, второе - когда нет. Если брать выгодно (МО
больше) СТАВИМ напротив этого кол-ва очков плюс, то есть надо брать.
!!!!
4) Используя непрерывность??? делаем такой переход: если с какого-то МЕНЬШЕГО, ЧЕМ Х кол-
ва очков набираем Х очков, ДЛЯ КОТОРЫХ ПРЕДВОРИТЕЛЬНО было подсчитано, что брать
выгодно - берём карту.
После не забываем всё-таки выполнить пункт 3, то есть сравнить два МО и решить, ставить "плюс"
или нет.

Это теория, а на практике я получил противоречие.
У игрока 8-18, у дилера 10. У меня получается, что брать карту не надо (МО = -25,95 против -24.15)
Возможно, брать требуется для того, чтобы вытащить десятку?
Какие у Вас будут комментарии?

PS Если вы использовали алгоритм, отличный от изложенного, с огромным удовольствием с ним
ознакомлюсь...
Kerjo
Re: Считаем БС.... [ID=45643] [ответ на 45642 ()]
Вт, 27 августа 2002 00:00 [#]
На непрерывность я бы не стал в данном случае рассчитывать, хотя бы потому, что функция
дискретная. И к тому же это не позволит тебе обнаружить точки, где более выгодно сплитование
и дабл.

В отношениии карты к 8-18 против 10-ки - скорее всего у тебя где-то ошибка в алгоритме. (Хотя я
сам до сих пор еще не дописал свой симулятор и собственно ручно не проверил).
Pan Votruba
Читаем БС? [ID=45647] [ответ на 45642 ()]
Ср, 28 августа 2002 00:00 [#]
> 2 Pan Votruba
> Спасибо за Ваши советы, но пока они мало помогают Wink
Советы были направлены на поиск недостющей инфы в инете... - Что это так трудно???
Ну подсказываю топик:
http://www.poker.ru/?FID=1&LMID=1&MID=3&IN=1&FWIN=1&FMID=2244
А здесь:
http://www.poker.ru/?FID=1&IN=1&MID=3&FWIN=3&FMID=2258
в приаттаченном файле - набор карт дилером. (Демонстрация алгоритма, не более)

Второй совет тебе давался про фри-софт. На известных поисковиках набираешь
<blackjack & (software|program|code)> и получаешь сотни ссылок, в том числе и исходников
времен DOSa - середины 90-х годов... РАЗБИРАЙСЯ в них, если тематика действительно
интересна!

> Итак, я, последовава совету Kerjo решил не изобретать велосипед ...
> .............
> Это теория, а на практике я получил противоречие.
> У игрока 8-18, у дилера 10. У меня получается, что брать карту не надо
"Маразм крепчал..." (с)
Нет! Ну кому интересно, ЧТО и КАК ты делал неправильно? -(
Вот положительные примеры: Блитц, Петер, Алекс-Кардинал сделали свои версии софта
самостоятельно и без лишнего шума! И спокойно продемонстрировали... - И по 4 значащие
цифры результаты совпадают у всех (основные посиции БС).

С точки зрения алгоритмов, последовательность "познания БД" очевидна:
1) набор карт дилером (все форсированно!);
2) набор карт игроком на ЖЕСТКИХ на 12 и выше;
3) набор карт игроком на МЯГКИХ картах;
4) набор карт игроком на ЖЕСТКИХ до 12;
5) other.

Удачи!
ПВ
З.Ы. Честно: не ищи здесь нянек! - Заматерей, чтобы тебя считали равным...
ЗилОн2
Re: Считаем БС.... [ID=45649] [ответ на 45643 ()]
Чт, 29 августа 2002 00:00 [#]
На непрерывность я бы не стал в данном случае рассчитывать, хотя бы потому, что функция
дискретная.
Под непрерывностью я понимаю следующее утверждение: если известно, что на Х(для простоты
жёстких) очках я беру карту - я тем более должен брать на Х-1.

И к тому же это не позволит тебе обнаружить точки, где более выгодно сплитование
и дабл.
Не знаю, по-моему я их уже могу обнаруживоть. Рассмотрим пример. Сплит 6 (3,3) против 6.
Если не сплитуем МО = -1,28%
Ссли сплитуем МО - положительное (у меня пока численно с Лесным не совпадает Sad )
Вывод очевиден Smile


В отношениии карты к 8-18 против 10-ки - скорее всего у тебя где-то ошибка в алгоритме. (Хотя я
сам до сих пор еще не дописал свой симулятор и собственно ручно не проверил).
Ошибка найдена - см. ниже.
ЗЫ Если не секрет, Вы в казино ходите?

2 All серьёзные программеры.
Подкиньте, пожалуйста, задачку которую сами осознали.
Типа, мой друг утверждает, что на 16 против 10 брать не выгодно - мелочь выгоднее отправть
дилеру. Учитываете ли Вы Факт, что в шафле лежит КОНКРЕТНАЯ карта, то есть, если её НЕ
ВОЗЬМЁТ игрок - ИМЕННО её ВОЗЬМЁТ дилер.
А я заодно свой код проверю Smile
ЗилОн2
Re: Читаем БС? [ID=45650] [ответ на 45647 ()]
Чт, 29 августа 2002 00:00 [#]
> 2 Pan Votruba
> Спасибо за Ваши советы, но пока они мало помогают Wink
Советы были направлены на поиск недостющей инфы в инете... - Что это так трудно???
Ну подсказываю топик:
http://www.poker.ru/?FID=1&LMID=1&MID=3&IN=1&FWIN=1&FMID=2244
А здесь:
http://www.poker.ru/?FID=1&IN=1&MID=3&FWIN=3&FMID=2258
в приаттаченном файле - набор карт дилером. (Демонстрация алгоритма, не более)

Извините, если вам не знакомы операторы do-while и case, то эффективность Вашего кода
сильно страдает.... Не обижайтесь, просто мне проще алгоритм описать словами...
НО обязательно дома разберу Ваши идеи...


Второй совет тебе давался про фри-софт. На известных поисковиках набираешь
<blackjack & (software|program|code)> и получаешь сотни ссылок, в том числе и исходников
времен DOSa - середины 90-х годов... РАЗБИРАЙСЯ в них, если тематика действительно
интересна!

Искал в Яндексе и Google, чест.слово... Мож стоит Lycos попробывать?


> Итак, я, последовава совету Kerjo решил не изобретать велосипед ...
> .............
> Это теория, а на практике я получил противоречие.
> У игрока 8-18, у дилера 10. У меня получается, что брать карту не надо
"Маразм крепчал..." (с)
Нет! Ну кому интересно, ЧТО и КАК ты делал неправильно? -(

Согласен, это скорее была психологическая уловка, чтобы привлечь внимание посетителей
форума
Smile
Кстати, я нашёл ошибку. Как не удивительно, жёсткие комбинации могут переходить в мягкие И
НАОБОРОТ. Таким образом, я ошибочно трактовал набор 5-7-туз как мягкий...


Вот положительные примеры: Блитц, Петер, Алекс-Кардинал сделали свои версии софта
самостоятельно и без лишнего шума! И спокойно продемонстрировали... - И по 4 значащие
цифры результаты совпадают у всех (основные посиции БС).

я потихоньку приближаюсь Smile

С точки зрения алгоритмов, последовательность "познания БД" очевидна:
1) набор карт дилером (все форсированно!);
2) набор карт игроком на ЖЕСТКИХ на 12 и выше;
3) набор карт игроком на МЯГКИХ картах;
4) набор карт игроком на ЖЕСТКИХ до 12;
5) other.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Если не сложно, подкиньте какую-нибудь задачку для обсчёта.
Что-то типа double на 9 vs 8...
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



Удачи!
ПВ

З.Ы. Честно: не ищи здесь нянек! - Заматерей, чтобы тебя считали равным...

Спасибо ещё раз. И взаимно удачи.
Pan Votruba
Re: Читаем БС? [ID=45651] [ответ на 45650 ()]
Пт, 30 августа 2002 00:00 [#]
>> А здесь:
>> http://www.poker.ru/?FID=1&IN=1&MID=3&FWIN=3&FMID=2258
>> в приаттаченном файле - набор карт дилером. (Демонстрация алгоритма, не более)
> Извините, если вам не знакомы операторы do-while и case,
> то эффективность Вашего кода сильно страдает....

"А мне то же самое. Только... с ПЕРЛАМУТРОВЫМИ пуговицами" (с)
-(((
ЗилОн2!
Во-первых, на тематическом форуме Главная инфа - правильный результат. Неважно каким
образом полученный. После програмной реализации - на фортране, бэйсике и т.д.;
вычисленный на логарифмической линейке или в уме; прочитанный где-либо...
Во-вторых, как было мною СРАЗУ указано - приводится исходник, демонстрирующий работу
алгоритма в НАИПРОСТЕЙШЕМ случае - набор карт дилером на равномерной, бесконечной
колоде. В частности, результаты совпадают с таблицей у Лесного. Для мало-мальски
САМОСТОЯТЕЛЬНО МЫСЛЯЩИХ программистов этот код уже может служить "точкой опоры" для
исчерпывающего моделирования БС.
В-третьих, лично Ваша программистская и "гэмблинг" квалификация (соотношение полезной
инфы/количество постов) пока ещё НЕ позволяют делать/давать публичные оценки кому- и чему-
либо... Ну, кроме наличия-отсутствия "перламутровости", разумеется.

*** Для програмеров:
За приведенный фрагмент кода не стыдно. По крайней мере, он, кроме правильности
исполнения, обладает еще двумя достоинствами: предельными (имхо) лаконичностью и
быстротой исполнения. Альтернативных реализаций в отечественном исполнении не видел.
((Напомню: вся БС для произвольного состава карт расчитывается быстрее 0.1 сек, т.е.
справедливо можно полагать - в реальном времени.))
У кого есть лучшие варианты - кидайте на мыло. Обсудим в привате.

Удачи!
ПВ