隨機算法之30萬員工抽取10萬員工(洗牌算法)


算法方面不是我的強項,所以遇到這個問題,記錄一下解決方法;


最開始的時候,做法是從random中來隨機選取一個,然後再判斷已有列表中是否存在,

然後以此重複,看到這裏,會算法的同學肯定會說這明顯不行;就好比多少人中生日爲一天的概率大於50%;


所以然後查找了一些資料,看到了洗牌算法;包括多種變種吧。


這裏說一下我參考的解決辦法;


比如有30萬個元素的列表,那麼第一次隨機選擇一個;記錄位置是x;

然後把元素的最後一個位置元素存入位置x,然後把最後位置的元素刪除;

(這裏在交換的時候,需要判斷這個元素原本是不是最後一個元素);

然後再在剩下的元素中隨機選擇一個,這樣就不會重複了;

交換最後一個元素,可以減少列表整體偏移帶來的性能影響;


大家可以試試;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章