python实现洗牌算法_如何高效而完美地洗牌?用Python做很简单

Python不用学,看看你就懂;拿来就能用,用用你就会

无需安装编程软件,把代码拷贝到在线编辑器即可运行

考虑一下扑克牌,如何用电脑编程做到高效而完美地洗牌呢?

要求是代码少、效率高,洗牌的结果要同时满足以下三个条件才算“完美”:初始状态无关性:洗牌后每张牌的位置与此前它的位置无关;

随机出现独立性:每张牌将出现的位置与其它牌是什么位置无关;

概率均衡相等性:每张牌在每个位置出现的概率完全一样,为1/N,N为牌的总张数。

你可以看到,那些“完美”的扑克牌手工洗牌——对半分然后一张一张交替插入的手法,虽然潇洒,洗牌效果却是不完美的,因为它显然不符合第1条“初始状态无关性”,并且也很有可能不符合第2条“随机出现独立性”。

还有一个隐含条件:不能重复,因为扑克牌每种牌只有一张。

考虑到上述条件,计算机编程应该如何做?

一种想法是,简单地采用范围 [1,N] 的随机数产生洗牌序列,每次与已经产生的牌点比较,有重复则放弃掉并重新产生。这种方法在已经产生大部分牌后,新生成的随机数与前面重复的可能性很大,因此要生成很多个随机数才能确定一张新位置的牌点。这样就不科学了,效率实在太低。

第二种想法是,随机产生第一张牌,然后用一个简单的算法依次产生后面的牌,算法本身保证牌点不会重复。为便于理解,例如只有5张牌,算法是循环加一个随机数d=[1,4]。若随机产生第一张牌3,且d=2,那么序列就是35241。若随机产生第一

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值