Реальные проблемы с наивным перетасовкой

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

Как Джефф Этвуд указывает на CodingHorror.com, один простой метод перетасовки (итерация через массив и замена каждой карты случайной карточкой в ​​другом месте массива) создает неравномерное распределение перестановок. В реальном приложении я просто использовал бы Knuth Fisher-Yates shuffle для более равномерной случайности. Но я не хочу увязывать объяснение концепций программирования с гораздо менее удобным для кодирования алгоритмом.

Это приводит к вопросу: насколько большая часть преимуществ имела бы "черная шляпа", если бы они знали, что вы использовали наивное тасование колоды с 52 карточками? Похоже, это было бы бесконечно мало.

Ответ 1

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

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

Ответ 2

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

Лично я считаю, что у студентов плохой алгоритм, когда правильный не сложнее (и проще визуализировать!) - это плохой подход.

Ответ 3

Оказывается, преимущество довольно значимо. Ознакомьтесь с этой статьей

Частью проблемы является ошибочный алгоритм, но другая часть - это предположение, что вы можете получить "случайные" числа с компьютера.

Ответ 4

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

Это на самом деле прекрасный пример для учеников осознать, что только потому, что что-то интуитивно, наивная тасовка в нашем случае не означает, что она правильная.

Ответ 5

Субъективная.

Похоже, это было бы бесконечно мало.

Согласен.

Ответ 6

Как и в стороне, в блоге ITtoolbox появилось сообщение