游戏算法之洗牌算法

作用

在游戏里面,常常会遇到要对一个序列进行随机打乱,例如斗地主的时候需要先对54张牌进行洗牌(随机打乱)。
作用:对一个序列进行随机打乱。

实现

Fisher_Yates

原始序列inputList和一个存放答案的序列ansList,每次随机从inputList当中选出一个数放到ansList末尾,并且把选中inputList里面元素踢出去。

Inside_Out

遍历数组inputArray从最后一个数开始,每次在[0,i]范围内生成一个下标j,让j和i位置数互换,然后i–。

random_shuffle

C++里面的random_shuffle可以对一个数组进行随机打乱。思路和Inside_Out差不多,只不过random_shuffle是每次把数交换到前面。

遍历数组inputArray从第一个数开始,每次在[i,Length)范围内生成一个下标j,让j和i位置数互换,然后i++。

感想

我第一次想的时候,想出来的方法是:开一个存答案的数组ansArray,从小遍历输入数组inputArray,每次随机出数组中的一个下标pos,把inputArray[i]放到ansArray[pos]。

但是这个存在一个很大的问题,每次随机出来的下标可能已经被占用,那么每次随机出来的数不一定是有效的,导致了不稳定。

随机问题,有两个很重要的考量就是随机性和稳定性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值