作用
在游戏里面,常常会遇到要对一个序列进行随机打乱,例如斗地主的时候需要先对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]。
但是这个存在一个很大的问题,每次随机出来的下标可能已经被占用,那么每次随机出来的数不一定是有效的,导致了不稳定。
随机问题,有两个很重要的考量就是随机性和稳定性。