随机算法之30万员工抽取10万员工(洗牌算法)


算法方面不是我的强项,所以遇到这个问题,记录一下解决方法;


最开始的时候,做法是从random中来随机选取一个,然后再判断已有列表中是否存在,

然后以此重复,看到这里,会算法的同学肯定会说这明显不行;就好比多少人中生日为一天的概率大于50%;


所以然后查找了一些资料,看到了洗牌算法;包括多种变种吧。


这里说一下我参考的解决办法;


比如有30万个元素的列表,那么第一次随机选择一个;记录位置是x;

然后把元素的最后一个位置元素存入位置x,然后把最后位置的元素删除;

(这里在交换的时候,需要判断这个元素原本是不是最后一个元素);

然后再在剩下的元素中随机选择一个,这样就不会重复了;

交换最后一个元素,可以减少列表整体偏移带来的性能影响;


大家可以试试;

你可能感兴趣的:(随机算法,洗牌算法)