算法方面不是我的強項,所以遇到這個問題,記錄一下解決方法;
最開始的時候,做法是從random中來隨機選取一個,然後再判斷已有列表中是否存在,
然後以此重複,看到這裏,會算法的同學肯定會說這明顯不行;就好比多少人中生日爲一天的概率大於50%;
所以然後查找了一些資料,看到了洗牌算法;包括多種變種吧。
這裏說一下我參考的解決辦法;
比如有30萬個元素的列表,那麼第一次隨機選擇一個;記錄位置是x;
然後把元素的最後一個位置元素存入位置x,然後把最後位置的元素刪除;
(這裏在交換的時候,需要判斷這個元素原本是不是最後一個元素);
然後再在剩下的元素中隨機選擇一個,這樣就不會重複了;
交換最後一個元素,可以減少列表整體偏移帶來的性能影響;
大家可以試試;