Сколько раз мне нужно повторять определенное перемешивание игральных карт, чтобы вернуться к тому, с чего я начал? - PullRequest
0 голосов
/ 05 ноября 2019

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


Хорошо, поэтому я пытаюсь найти алгоритм / функцию / что-то, что может подсчитать, сколько раз мне нужно сделать один и тот же тип перемешивания из 52 игральных карт, чтобы вернуться туда, где я начал.

Конкретная тасовка, которую я использую, выглядит следующим образом:
- У вас будет две стопки.
-У вас есть колода спиной вверх. (Давайте назовем эту колоду 1)
- Теперь вы можете поочередно положить карту в колоду 1 Пример. Предположим, у вас есть 4 карты в колоду, лицом вверх, идущие от 4, ближайших кземля и 1 ближайший к небу (Их порядок 4,3,2,1. Вы берете карту 1 и кладете ее под карту 4, карта 1 теперь ближе к земле, а карта 4 - вторая ближе, порядок теперь 1,4,3,2. и положить одну в стопку 2.
- Куча 2 будет «складываться вниз», что означает, что вы всегда будете помещать новую карту внизу этой стопки. (Обратно всегда вверх)
-Первая карта всегда кладется на заднюю часть стопки 1.
-Повторите этот процесс, пока все карты не окажутся в стопке 2.
-Теперь возьмите стопку 2 и сделайте то же самое, что вы только что сделали.

Мой вопрос: сколько раз мне нужно повторять этот процесс, пока я не вернусь к тому, с чего начал?


Дополнительные примечания:
- Если это распространенный способперемешивание карт и уже есть решение, пожалуйста, дайте мне знать.
- Яплохо знаком с математикой и кодированием, поэтому, если написать уравнение / алгоритм / код для этого действительно легко, не смейтесь надо мной, пожалуйста;
- Извините, если я спрашиваю об этом не в том месте, я не знаю, как все это работает.
- английский не является моим основным языком, и я не являюсь носителем языка, поэтому прошу прощения за любые плохие грамматические и / или другие грамматические ошибки.

У меня, однако, есть код, который делает все это( Ссылка здесь ), но я не уверен, что это самый эффективный способ сделать это, и он еще не дал результата, поэтому я даже не знаю, работает ли он. Если вы не хотите давать советы или предложения о том, как это изменить, пожалуйста, сделайте, я был бы очень признателен. Это сделано на пустом месте, потому что я не могу писать на других языках ... извините ...

Заранее спасибо.

1 Ответ

4 голосов
/ 05 ноября 2019

Любой фиксированный случайный порядок эквивалентен перестановке ;то, что вы хотите знать, это порядок этой перестановки . Это может быть вычислено путем разложения перестановки на циклов и последующего вычисления наименьшего общего кратного длин циклов.


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

Предположим, последовательность начинается с 1,2,3,4,5,6,7,8 и после одного тасования 3,1,4,5,2,8,7,6.

  • Число 1 переходит в положение 2, затем 2переходит в положение 5, затем 5 переходит в положение 4, затем 4 переходит в положение 3, затем 3 переходит в положение 1. Итак, первый цикл (1 2 5 4 3).
  • Число 6 переходит вположение 8, затем 8 переходит в положение 6. Таким образом, следующий цикл - (6 8).
  • Число 7 остается в положении 7, поэтому это тривиальный цикл (7).

Длины циклов 5, 2 и 1, поэтому наименьшее общее кратное равно 10. Для этого шаффла требуется 10 итераций, чтобы вернуться кначальное состояние.


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

...