Реальные проблемы с наивным перетасовкой
Я пишу несколько статей, предназначенных для обучения начинающим концепциям программирования с помощью связанных с покером тем. В настоящее время я работаю над перетасовкой.
Как Джефф Этвуд указывает на CodingHorror.com, один простой метод перетасовки (итерация через массив и замена каждой карты случайной карточкой в другом месте массива) создает неравномерное распределение перестановок. В реальном приложении я просто использовал бы Knuth Fisher-Yates shuffle для более равномерной случайности. Но я не хочу увязывать объяснение концепций программирования с гораздо менее удобным для кодирования алгоритмом.
Это приводит к вопросу: насколько большая часть преимуществ имела бы "черная шляпа", если бы они знали, что вы использовали наивное тасование колоды с 52 карточками? Похоже, это было бы бесконечно мало.
Ответы
Ответ 1
Не похоже, что вы пишете покерную программу, которая будет использоваться для реального онлайн-сайта азартных игр. Способность кого-то обманывать программу не имеет большого значения, когда вы преподаете людям, как программировать.
Оставьте записку о том, что это плохая модель реального мира (со ссылкой на нее как возможный недостаток безопасности) и продолжайте учиться.
Ответ 2
Перетасовка сундука является незначительным изменением по сравнению с наивным перетасовкой: просто поменяйте местами любую карту в оставшейся (небезопасной) секции колоды, а не где-нибудь во всей колоде. Если вы думаете об этом как о повторном выборе следующей карты по порядку от оставшихся неубранных карт, это тоже довольно интуитивно.
Лично я считаю, что у студентов плохой алгоритм, когда правильный не сложнее (и проще визуализировать!) - это плохой подход.
Ответ 3
Оказывается, преимущество довольно значимо. Ознакомьтесь с этой статьей
Частью проблемы является ошибочный алгоритм, но другая часть - это предположение, что вы можете получить "случайные" числа с компьютера.
Ответ 4
Простым и справедливым алгоритмом для перетасовки было бы назначить случайное число с плавающей запятой (например, между 0 и 1) на каждую карту в колоде, а затем отсортировать колоду по назначенным номерам.
Это на самом деле прекрасный пример для учеников осознать, что только потому, что что-то интуитивно, наивная тасовка в нашем случае не означает, что она правильная.
Ответ 5
Субъективная.
Похоже, это было бы бесконечно мало.
Согласен.
Ответ 6
Как и в стороне, в блоге ITtoolbox появилось сообщение