洗牌算法怎么样才够乱

【洗牌算法怎么样才够乱】 我非常喜欢这种对自然语言中的词汇去较真的问题。比如定义:洗牌过程中,到底什么是“乱”?

我认为对“乱”的一个合理的定义就是:一副扑克54张牌,有54!种排列方式。你所给出的洗牌算法,应该能够等概率地生成这54!种结果中的一种:)

经典的Fisher-Yates算法之所以经典,就是用很低的耗费:O(1)空间和O(n)时间,完成了这个任务。当然一个显而易见的解法是生成所有54!种排列然后随机抽取,但是稍微计算一下就会明白这样做空间复杂度和时间复杂度都是不可以接受的:)

■网友
http://www.jianshu.com/p/1a23d7c28d49这是我第一次接触洗牌算法,也强烈建议题主实现一下这个算法
■网友
这个乱不乱还真是不好懂。。。以下为个人猜测:面试官的评价,大概是指random函数因为seed的限制而导致了同一个seed所造成的随机数序列总是一定的这种伪随机性质吧。也就是说如果能够预测你洗牌时所用的seed的值理论上你洗完牌之前我就能知道你的洗牌结果,听起来很老千的感觉。。。经典的洗牌算法大概是Fisher-Yates算法吧,具体的google一下会有一大把。其他还有一些算法,比如模拟双手洗牌再多次重复,以及将所有54!种排列全部列出来然后随机抽其中一个排列等。 记得@陈皓的文章也提到过。单纯讨论乱的话,我觉得还是应该向随机数生成的部分找办法。Mersenne Twister法算是个不错的方案,在低于623次元的空间以内不存在线性回归。其余的随机数生成方法没涉猎过就不提了,题主自行google吧,hash算法看起来是个不错的方向。


    推荐阅读