2010-04-26 3 views
4

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

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

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

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

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


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

+1

Я не понимаю ваш вопрос; что непонятно в алгоритме? – Pops

+2

Если вы собираетесь положить деньги на это, я бы предложил «SecureRandom» с хорошим семенем. (И, возможно, подумайте о платной поддержке.) –

+0

непонятно == неслучайно? –

ответ

9

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

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

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

  • вы, вероятно, следует создать экземпляр одного ПСЧ для каждой игры
  • вы должны быть перетасовки только колоду между руками; из вашего вопроса, это не 100% ясно, что вы также не перетасовки колоды между флоп, терн, реки и т.д.
+0

N.B. Я просто чувствую, что в правилах США предусматривается RNG с периодом больше 2^160, так что SecureRandom * woudln't * будет достаточным. Я подчеркиваю, что могу ошибаться. –

+0

Я уверен, что вы можете установить более безопасные PRNG, а затем запросить его по имени, используя ['SecureRandom.getInstance (String)'] (http: //java.sun.ком/JavaSE/6/документы/API/Java/безопасность/SecureRandom.html # деЫпзЬапсе (java.lang.String)). –

4

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

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

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

6

Collection.shuffle использует реализацию O (п) перетасовки Fisher-Yates алгоритм.

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

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

+2

Конечно, вам нужно засеять его чем-то намного лучше, чем System.currentTimeMillis() - см. Http://www.javamex.com/tutorials/random_numbers/entropy_sources.shtml –

2

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

Если вы хотите получить дополнительную информацию о самом алгоритме тасования, см. Java's Collections.shuffle is doing what?.

4

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

How We Learned to Cheat at Online Poker

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

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

+0

Хорошая статья, хотя на самом деле нет причин не для использования довольно большого семени, которое хорошо смешивается на регулярной основе. Трудно создать операцию хэширования для небольшого семени, которое может захватить всю энтропию, которая может присутствовать в источнике случайности. Легче захватить энтропию в более крупное семя. – supercat

0

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

0

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