如何在Python中高效生成不重复的随机数?
嘿,你这个思路其实很直观,但确实存在效率问题——尤其是当你要生成的不重复数越多、范围越大的时候,每次检查number not in empty的成本会越来越高,因为列表的成员检查是线性遍历的(O(n)时间复杂度),越往后白忙活的概率越大。
给你两个更高效的方案,都是利用Python标准库的原生实现,比手动循环检查靠谱多了:
方案一:用random.sample()(最推荐)
random.sample()就是专门用来从一个序列中随机选取指定数量的不重复元素的,内部实现已经做了优化,完全不用你手动去做存在性检查。
针对你的需求,代码可以写成这样:
import random # 从500到509(左闭右开,对应randrange(500,510)的范围)里选9个不重复的数 unique_numbers = random.sample(range(500, 510), 9) print("Final list -->", unique_numbers)
这个方法的好处是:
- 代码简洁到极致,逻辑一目了然
- 效率高,时间复杂度远低于手动循环检查,尤其是当要取的元素数量较多时
- 不需要维护一个空列表手动添加元素,一步到位
方案二:如果需要打乱整个范围的所有数(取全部元素)
要是你需求变成把500到509的所有数随机打乱顺序,那用random.shuffle()更合适:
import random # 先生成完整的范围列表,再打乱 number_list = list(range(500, 510)) random.shuffle(number_list) print("Shuffled full list -->", number_list)
为什么你的原方法效率低?
再回头说下你的原代码:当列表里的元素越来越多,if number not in empty这一步需要遍历整个列表去比对,比如当列表已有8个元素时,每次生成的随机数有8/10的概率是重复的,这时候不仅要遍历8次检查,还得重新生成数字——完全是做无用功。而random.sample()会直接避免这种重复生成的情况,内部用更高效的算法确保每个元素只被选一次。
总之,能用标准库原生方法解决的问题,就别自己造轮子啦,既省心又高效~
内容的提问来源于stack exchange,提问作者Bibek Bhandari
相关产品推荐
相关产品推荐

