【发布时间】:2014-12-22 18:02:38
【问题描述】:
我正在和我的兄弟们讨论一种快速而肮脏的算法,用于洗牌一副纸牌(即每个元素都是唯一的数组)。算法说明:
让牌组中的牌张数为n。取一个数字x,这样gcd(n,x)=1。现在迭代地为i=1 到i=n 挑选卡号(x*i) mod n 并将其放入新的牌堆中(无需从原来的牌组中取出牌,即复制卡)。新的牌堆就是我们的结果。
我似乎很清楚,仅执行一次该算法不会给出“足够随机”的结果(从某种意义上说,它将无法通过统计测试来确定随机性)。但是,如果我们迭代地执行算法,可能会得到一个新值x,它也满足gcd(n,x)=1?如果这样做足够多的次数会给我们一个“足够随机”的结果,那么作为n 的函数,我们预计需要执行多少次?
【问题讨论】:
-
既然excellent efficient algorithms 已经可用,为什么还要创建一个可疑且昂贵的算法?
-
@pjs 我只在理论上对此感兴趣,而不是作为问题的实际解决方案。
-
你会如何选择
x或者更确切地说你会为x选择什么?要使gcd(n, x)成为1,x必须是大于n的最小素数。所以输入n = 10, x = 11,你最终会得到相同的牌组。 -
@YuHao 任何洗牌算法中的第一个操作都不会导致洗牌,但迭代地执行相同的操作有时会起作用。
-
@HarshGupta 好点!当然我要求 x 介于 1 和 n 之间。