Python不用学,看看你就懂;拿来就能用,用用你就会
无需安装编程软件,把代码拷贝到在线编辑器即可运行
考虑一下扑克牌,如何用电脑编程做到高效而完美地洗牌呢?
要求是代码少、效率高,洗牌的结果要同时满足以下三个条件才算“完美”:初始状态无关性:洗牌后每张牌的位置与此前它的位置无关;
随机出现独立性:每张牌将出现的位置与其它牌是什么位置无关;
概率均衡相等性:每张牌在每个位置出现的概率完全一样,为1/N,N为牌的总张数。
你可以看到,那些“完美”的扑克牌手工洗牌——对半分然后一张一张交替插入的手法,虽然潇洒,洗牌效果却是不完美的,因为它显然不符合第1条“初始状态无关性”,并且也很有可能不符合第2条“随机出现独立性”。
还有一个隐含条件:不能重复,因为扑克牌每种牌只有一张。
考虑到上述条件,计算机编程应该如何做?
一种想法是,简单地采用范围 [1,N] 的随机数产生洗牌序列,每次与已经产生的牌点比较,有重复则放弃掉并重新产生。这种方法在已经产生大部分牌后,新生成的随机数与前面重复的可能性很大,因此要生成很多个随机数才能确定一张新位置的牌点。这样就不科学了,效率实在太低。
第二种想法是,随机产生第一张牌,然后用一个简单的算法依次产生后面的牌,算法本身保证牌点不会重复。为便于理解,例如只有5张牌,算法是循环加一个随机数d=[1,4]。若随机产生第一张牌3,且d=2,那么序列就是35241。若随机产生第一