[算法] 洗牌算法&随机算法

  1. 洗牌算法:该算法表示,比如一共有52张扑克牌,如何去洗牌,可以让扑克牌的牌的顺序保证随机性?首先我们知道使用排列组合的话52张扑克牌产生的组合就是52!种排列。我们不妨把52张扑克牌当成52个位置去填,第0个位置可以从52张扑克牌里面任意选取一张,第1个位置可以从剩下的51张扑克牌里面随机选取一张。。。依次类推。但是如何用随机算法去实现这个功能呢?我们有个随机函数能够产生0-1之间的随机数。所有的扑克牌都可能出现在第0个位置,而第二个位置只有51种可能性,我们从前往后扫描扑克牌,到达第k张扑克牌时,产生一个随机的交换位置在0到k(包括k)之间,那么由于k是从0到52,而第k张扑克牌可以随机交换的位置是[0, k],而第k+1张扑克牌可以随机交换的位置是[0,k+1],那么对于每个位置i,能够从其他位置交换过来的可能性是52-i,比如i=0时,所有52张扑克牌都可以交换过来,第1个位置的话只能是k=1到51时这51种可能会交换过来。
  2. n个中随机选取一个:每个数都有可能被选中,那么每个数的概率应该就是1/n。当n=1时,只有一个元素,那么这个数肯定会被选中,即概率是1。我们逐渐增加元素的个数直到为n。从前k个中随机挑了一个元素,那么前k个元素每个被挑中的概率就是1/k。当我们再往后扫描一个数字到第k+1个数字时,每个元素应该是1/(k+1)的可能被选中。第k+1个数字被选中的可能是1/(k+1)。而之前从前k个元素中选中的那个元素原来的概率是1/k,到达第k+1个元素时,选中的元素在前k个元素中的概率是k/(k+1),那么此时前k个中那个被选中的元素的概率实际上就变成了1/k*k/(k+1) = 1/(k+1)。也就保证了前k个中元素被选中的概率和第k+1个元素一样,都是1/(k+1)。
  3. n个中随机选取m个:这次需要从n个中选取m个元素(默认假设n > m)。那么最终我们要保证每个元素被选中的概率都是m/n。首先如果是从前m个元素中选取m个元素,那么前m个元素各个元素被选中的概率都是1。我们逐渐增加元素的个数直到n。当有k个元素时,每个元素被选中的概率是m/k。当我们再加入一个元素的时候,这个元素应该有m/(k+1)的可能性被选中,而对于前面k个中被选中的元素,它们此时仍旧在这m个最终元素数组中的可能性应该也要变成m/(k+1)。当加入第k+1个元素时,我们可以去产生一个随机数在0到k+1之间,如果小于m则代表这个元素被选中了(概率是m/(k+1)),因为一共只有m个元素,这个元素被选中了也就代表前面k个元素中被选中的m个元素中有一个需要被剔除。那么这个元素被选中的可能性是1/m,所以这m个元素被剔除的可能性是m/(k+1)* 1/m = 1/(k+1) 。所以说前面k个元素中那些被选中的元素还保留的可能性是m/k*(1-1/(k+1)) = m/k * k/(k+1) = m/(k+1)。依次类推,不断加入元素直到一共有n个元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值