洗牌算法的奇妙技巧之绝对公平的算法

引言

逛知乎时,看到一个问题:世界上有哪些代码量很少,但很牛的算法?
有一个回答提到了洗牌算法。(在此感谢程序员吴师兄的回答,原文链接找不到了)看完之后,惊为天人,特此记录,致敬一下发明算法的大神。

题目描述

扑克牌大家都玩过吧?有没有想过三人斗地主是怎么发牌的呢?
一言以蔽之,洗牌算法要求我们设计一个公平的算法去完成洗牌。

解决方案?

洗牌?那就随机交换其中的两个数k次吧。
k取多少呢?对于n = 100,k取10000次太多;对于n = 1E10,k取10000次又太少,似乎不好界定。
好,就算你想方设法确定了一个合理的k,那么,这样洗牌真的公平吗?
能否保证每个位置上出现的牌都是等概率的呢?Emmmm…陷入沉思。
机智的你,灵光一闪!
对于n张牌,共有n!种排列组合的情况,我们从n!种随机选取一种,那么每个组合出现的概率即为1/ n!,决定的公平!
Yes but not best,O(n!)的时间复杂度实在是太爆炸了,无法容忍。
啊,投降。

神之算法 —— Knuth洗牌算法

先上代码:


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值