algorithm - 我必须重复多少次特定的洗牌才能回到我开始的地方?
问题描述
这是我在 Stack Overflow 上的第一篇文章,所以如果我做错了什么,请原谅我的错误。
好的,所以我正在尝试找到一种算法/函数/东西,它可以计算出我必须做多少次相同类型的 52 张扑克牌洗牌才能回到我开始的地方。
我使用的特定洗牌是这样的:
- 你将有两堆。
- 你的甲板背面朝上。(让我们称这堆牌为 1)
- 您现在将交替将一张牌放在 1 堆的后面示例:假设您有 4 张牌,背面朝上,从最靠近地面的 4 张和最靠近地面的 1 张开始天空(他们的顺序是 4,3,2,1。你把卡片 1 放在卡片 4 的下面并将一张牌放入第 2 堆
。-第 2 堆将“向下堆叠”,这意味着您将始终将新卡放在该堆的底部。(背面始终朝上)
-第一张卡将始终放在第 1 堆的后面.
- 重复这个过程,直到所有卡片都在第 2 堆中。
- 现在拿第 2 堆,做你刚才做的完全相同的事情。
我的问题是:我必须重复这个过程多少次才能回到开始的地方?
旁注:
- 如果这是一种常见的洗牌方式并且已经有解决方案,请告诉我。
- 我对数学和编码还是新手,所以如果为此编写一个方程/算法/代码真的很容易,那么请不要嘲笑我;<。
- 抱歉,如果我在错误的地方问这个问题,我不知道这一切是如何运作的。
- 英语不是我的主要语言,我也不是母语人士,所以请原谅任何不好的语法和/或其他语法错误。
但是,我确实有一个代码可以完成所有这些工作(链接在这里),但我不确定这是否是最有效的方法,而且它还没有给出结果,所以我什至不知道它是否有效。如果您不想就如何更改它提供提示或建议,请这样做,我将非常感激。它是从头开始的,但是因为我不能用任何其他语言写作......对不起......
提前致谢。
解决方案
任何固定的 shuffle 都相当于一个permutation;您想知道的是该排列的顺序。这可以通过将排列分解为循环然后计算循环长度的最小公倍数来计算。
我无法正确理解您的算法,但这里有一个洗牌 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。这个 shuffle 需要 10 次迭代才能回到初始状态。
如果您不介意用笔和纸坐下一会儿,您应该能够按照此过程来制定您自己的洗牌算法。
推荐阅读
- javascript - Atom:将代码放在正文 HTML 上后,Javascript 显示“ReferenceError:文档未定义”
- modelica - 与使用 DASSL 的正常计算模式相比,Dymola 中的内联集成的性能
- javascript - 续集“包含”不工作的白色多对多关系
- java - 将基于 Java Swing ANT 的应用程序迁移到 GCP
- selenium - 同一 TestFixture 中的 NUnit Selenium 测试不能并行运行
- javascript - 制作A4页pdf报告
- vb.net - 集合列表清空自己
- php - 如何使用 OOP 调用本地属性?
- python - tkinter 比例尺的固定值,但范围仍为 0-180
- git - 同一项目文件夹中不同 git 存储库的全局多个用户名