Подходит ли Collections.shuffle для покерного алгоритма? - PullRequest
4 голосов
/ 26 апреля 2010

в java есть покер-система, которая использует Collections.shuffle() на всех доступных картах до раздачи карт.

Итак, коллекция из 52 карт 2-9, J, Q, K, A в 4 типах.

После этого мы Collections.shuffle().

Проблема в том, что кажется (до сих пор у нас не было большой статистики, возможно, что мы видим только много статистических выводов), что алгоритм ОЧЕНЬ неясен.

Итак, Collections.shuffle() хорошо для алгоритма покера?


Ответы на комментарии: С «неясно» я имею в виду, что это очень и очень загадочно. Многие пользователи жалуются на то, что «это не то же самое, что живые / другие покер-румы». Я много играл с этой системой и должен сказать, я согласен, я вижу 3 Royal Flash в менее чем 2000 разыгранных раздачах в этой системе и живу / в других покер-румах с более чем 100 000 разыгранных раздач, которые я вижу до сегодняшнего дня.

Ответы [ 7 ]

9 голосов
/ 26 апреля 2010

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

Немного более длинный ответ: если вы не можете получить аппаратное обеспечение для выполнения настоящей случайности, Collections.shuffle(List, Random) может быть достаточно хорошим, если вы предоставите SecureRandom . Сложность этого решения - найти хорошее начальное значение.

ОБНОВЛЕНИЕ: Исходя из ваших разъяснений, я бы посоветовал вам посмотреть, как вы заполняете PRNG (при условии, что вы уже используете криптографически безопасную реализацию; если нет, сделайте это сначала). Вы должны не использовать ограниченный набор семян. Другие вещи для рассмотрения:

  • вам, вероятно, следует создавать один PRNG для каждой игры
  • вы должны перетасовывать колоду только между руками; из вашего вопроса, не на 100% ясно, что вы также не перемещаете колоду между флопом, терном, рекой и т. д.
6 голосов
/ 26 апреля 2010

Collection.shuffle использует O (n) реализацию алгоритма тасования Фишера-Йейтса .

И случайные индексы выбираются с помощью обычного PRNG Java, поэтому он будет примерно одинаковым: каждое перетасование колоды будет столь же вероятным, как и любое другое.

Это вполне нормально для того, что вы хотите сделать, но когда вам нужна реальная рандомизация, вы должны ввести некоторые реальные случайные факторы (например, System.currentTimeMillis(), используемый для заполнения генератора случайных чисел) или что-то более реальное, например, специализированное оборудование.

4 голосов
/ 26 апреля 2010

Предлагаю прочитать эту статью:

Как мы научились обманывать в онлайн-покере

Авторы просмотрели один программный пакет и обнаружили несколько недостатков. Одной серьезной проблемой было семя. Если вы начинаете с 32-разрядного начального числа (и не генерируете новое независимое начальное число во время перемешивания), вы можете генерировать только 2 ^ 32 различных случайных последовательностей. В колоде из 52 карт возможны 2 ^ 226 возможных перетасовок, что означает, что будет произведена лишь небольшая часть возможных порядков колод.

Игрок знает 5 позиций карт (7 в Омахе) на флопе. Если игрок знает алгоритм перемешивания, он может угадать, какие семена кандидата были основаны на картах, которые он видит. Это дает ему большое преимущество в определении вероятностей скрытых карт.

4 голосов
/ 26 апреля 2010

Хорошо, я вообще ненавижу, когда люди говорят мне это, но да и нет. Это почти так же хорошо, как pickrandomcardbetween (1, 52) и использовать функцию rand (), когда дело доходит до случайности.

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

Редактировать: Если ваша покерная система предназначена для игры ради удовольствия, это одно, но когда деньги задействованы, люди будут подвешивать вас за создание случайных результатов таким образом.

2 голосов
/ 26 апреля 2010

Если это серьезное покерное программное обеспечение с привлечением денег, то ответ будет отрицательным. (Для этого вам понадобится какой-то источник истинной случайности.) Однако для простых обстоятельств это почти такое же хорошее решение, как и любой другой алгоритм.

Если вам нужна дополнительная информация о самом алгоритме перемешивания, см. Что делает Java Collections.shuffle? .

0 голосов
/ 11 ноября 2013

Я могу вам сказать, что это не так, как это делают крупные покерные сайты. Предварительное перемешивание колоды делает последовательность карт доступной в памяти на игровом сервере, то есть ее можно прочитать, если у вас есть доступ к хосту сервера (как у ops). Вместо этого карты выбираются случайным образом из колоды всякий раз, когда они необходимы (с использованием безопасного случайного в верхней части аппаратного RNG). Это иногда приводит вас в замешательство, когда вы получаете «неправильные» общие карты, потому что, если вы просто ждали миллисекунду, чтобы позвонить, они были бы другими:)

0 голосов
/ 26 апреля 2010

Проблема в том, что числа, сгенерированные случайным образом, являются статистически случайными. Это означает, что перемешивание не ведет себя как колода карт, потому что оно более случайное, чем случайное перемешивание в реальной жизни. Чтобы иметь что-то более реалистичное, вам нужно смоделировать способ перетасовки карт в реальной жизни, например, сколько раз вы резали и так далее. Я увидел сайт с диаграммой, сравнивающей результаты реальных игр в кости и результаты, полученные с помощью компьютера, которые показали, насколько отличались результаты. Результаты на компьютере были распределены более равномерно, но я не могу найти ссылку в Google.

...