【问题标题】:Quick idea for a shuffling algorithm - would this work?洗牌算法的快速想法——这可行吗?
【发布时间】:2014-12-22 18:02:38
【问题描述】:

我正在和我的兄弟们讨论一种快速而肮脏的算法,用于洗牌一副纸牌(即每个元素都是唯一的数组)。算法说明:

让牌组中的牌张数为n。取一个数字x,这样gcd(n,x)=1。现在迭代地为i=1i=n 挑选卡号(x*i) mod n 并将其放入新的牌堆中(无需从原来的牌组中取出牌,即复制卡)。新的牌堆就是我们的结果。

我似乎很清楚,仅执行一次该算法不会给出“足够随机”的结果(从某种意义上说,它将无法通过统计测试来确定随机性)。但是,如果我们迭代地执行算法,可能会得到一个新值x,它也满足gcd(n,x)=1?如果这样做足够多的次数会给我们一个“足够随机”的结果,那么作为n 的函数,我们预计需要执行多少次?

【问题讨论】:

  • 既然excellent efficient algorithms 已经可用,为什么还要创建一个可疑且昂贵的算法?
  • @pjs 我只在理论上对此感兴趣,而不是作为问题的实际解决方案。
  • 你会如何选择x 或者更确切地说你会为x 选择什么?要使gcd(n, x) 成为1x 必须是大于n 的最小素数。所以输入n = 10, x = 11,你最终会得到相同的牌组。
  • @YuHao 任何洗牌算法中的第一个操作都不会导致洗牌,但迭代地执行相同的操作有时会起作用。
  • @HarshGupta 好点!当然我要求 x 介于 1 和 n 之间。

标签: algorithm random


【解决方案1】:

由于模算术的奇妙,多次执行它是不够的。事实上,您最多可以通过这种方式实现n 排列,而这正是n 是素数或1 的时候。

假设你要这样做两次,第一次xn 互质,第二次yn 互质。

第一次将位置p 的元素移动到p * x (mod n)。然后第二次移动到(p * x) * y (mod n)。这与将其移至 p * (x * y) (mod n) 相同,因为模算术具有关联性。但是如果 x * y = v (mod n) 则与将其移至 p * v (mod n) 相同——正如您所知,等价类不超过 n

因此,最多有n 排列可以产生n-length 牌组。 (不,这不是一个严格的证明!)

编辑:

我曾声称,如果您改为使用模乘乘幂,它会更好。然而,经过额外考虑,许多琐碎的配置仍然会以相同的“最多n 排列”方式成为模运算的牺牲品。

【讨论】:

    猜你喜欢
    • 2010-12-30
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多