Я делаю игру, в которой последовательно представлены различные виды головоломок. Я выбираю каждую головоломку с псевдослучайным числом. Для каждой головоломки есть несколько вариантов. Я выбираю вариант с другим псевдослучайным числом. И так далее.
Дело в том, что, хотя это приводит к почти случайной случайности, это не то, чего действительно хочет игрок. Игрок, как правило, хочет, чтобы то, что он воспринимает, был идентифицирован как случайный, но только если он не склонен повторять головоломки. Так что не совсем случайно. Просто непредсказуемо.
Думая об этом, я могу представить себе хакерские способы сделать это. Например, временно исключая самые последние N вариантов из набора возможностей при выборе нового варианта. Или присваивая каждому варианту равную вероятность, уменьшая вероятность выбора до нуля при выборе, а затем медленно увеличивая все вероятности с каждым выбором.
Я предполагаю, что есть установленный способ сделать это, но я просто не знаю терминологию, поэтому я не могу ее найти. Кто-нибудь знает? Или кто-нибудь решил это приятным способом?
Ответы:
Если у вас есть конечное число головоломок, вы можете:
РЕДАКТИРОВАТЬ
Я не знал этого, но просмотр SE заставил меня осознать, что это на самом деле известно как «случайная сумка». Еще немного информации здесь , здесь или там .
РЕДАКТИРОВАТЬ 2
Классический Кнут Шаффл идет следующим образом:
Стивен Стадницки справедливо указал в своем комментарии, что подобные вещи не предотвращают повторение кадровых перестановок. Чтобы принять это во внимание, добавьте специальный случай для последнего элемента:
источник
Вариант подхода Лоранку: для каждого типа головоломки сохраняйте массив (перемешанных) номеров головоломки; затем каждый раз, когда вы нажимаете на головоломку этого типа, убирайте следующий номер из списка. например, допустим, у вас есть головоломки Sudoku, Picross и Kenken, каждая из которых содержит головоломки 1..6. Вы создали бы три перемешанных массива чисел 1..6, по одному для каждого типа головоломки:
Теперь вы бы перемешали типы головоломок, как предлагает Лоранку; допустим, это подходит [Picross, Sudoku, Kenken]. Затем каждый раз, когда вы нажимаете на головоломку определенного типа, используйте следующий номер в «списке случайных чисел»; В целом, ваша презентация головоломки будет [Судоку № 5, Picross № 6, Кенкен № 3, Судоку № 6, Picross № 2, Кенкен № 2, ...]
Если вы не хотите держать головоломки в одном и том же общем порядке каждый раз в цикле, то я думаю, что ваш вариант «выбрать случайным образом, игнорируя последние несколько выборов» является лучшим. Есть способы сделать это немного более эффективным; например, предположим, что у вас есть 20 вещей, и вы хотите игнорировать последние 5 выбранных. Затем вместо случайного выбора числа 1..20 и «перемотки» до тех пор, пока вы не получите одно из последних 5, вместо этого просто выберите число 1..15 и пройдитесь по множеству шагов ваших типов головоломки, просто пропустив любой тип головоломки, который выбранный (вы можете сделать это легко, сохранив битовый массив, содержащий последние 5 выбранных головоломок).
источник