如何在Python中生成无重复随机数?Python3.6无重复4位随机数实现
嘿,我来帮你搞定这两个Python随机数的问题!
一、如何在Python中生成不重复的随机数?
生成不重复随机数的方法有好几种,看你的需求场景来选:
用
random.sample()(最直接高效):如果你的目标是从一个已知的序列/范围里挑选N个不重复的随机数,这个方法是首选。它会直接返回一个包含N个唯一元素的列表,完全不用自己写去重逻辑。比如从1到100里选5个不重复的数:import random unique_nums = random.sample(range(1, 101), 5) print(unique_nums) # 输出类似 [23, 5, 78, 12, 45]洗牌法(适合打乱全序列场景):如果你需要把一个序列里的所有元素随机打乱,且每个元素只出现一次,可以用
random.shuffle()。比如把1到10的顺序彻底打乱:nums = list(range(1, 11)) random.shuffle(nums) print(nums) # 输出类似 [7, 2, 9, 1, 5, 10, 3, 8, 4, 6]循环生成+去重(不推荐大范围场景):如果你的随机数范围很大,且只需要少量不重复的数,也可以循环生成然后用集合去重,但这种方法效率很低——尤其是当你要的数量接近范围上限时,会重复生成很多重复值,不推荐优先使用。举个例子:
import random unique_set = set() while len(unique_set) < 5: unique_set.add(random.randint(1, 100)) unique_nums = list(unique_set) print(unique_nums)
二、Python 3.6中生成无重复数字的4位随机数(0000-9999)
这个需求的核心是4个数字完全不重复,且允许前导零,最直接高效的思路是直接从0-9这10个数字里选4个不重复的,再拼接成4位字符串:
具体实现代码
import random def get_unique_4digit_num(): # 从0到9中随机挑选4个不重复的数字 selected_digits = random.sample(range(10), 4) # 把数字转成字符串并拼接,自动保留前导零(比如选了0、1、2、3就变成"0123") return ''.join(map(str, selected_digits)) # 测试示例 print(get_unique_4digit_num()) # 输出类似 "3075" 或 "0148"
思路拆解
- 为什么选
random.sample()?:它天生保证选出来的元素是唯一的,不用额外写逻辑检查重复数字,效率拉满。 - 为什么用字符串格式?:如果直接转成整数,像"0123"这样的数会变成123,丢失前导零,而题目要求范围是0000-9999,所以字符串格式才完全符合要求。
- 如果不想允许前导零怎么办?:可以稍微调整逻辑,先从1-9里选第一个数字,再从剩下的9个数字(包括0)里选3个:
def get_nonzero_start_4digit(): first_digit = random.randint(1, 9) remaining_digits = random.sample([d for d in range(10) if d != first_digit], 3) all_digits = [first_digit] + remaining_digits return ''.join(map(str, all_digits))
另外,真心不推荐用“生成随机4位数然后检查是否有重复数字”的方法——比如循环生成random.randint(0, 9999),然后转成4位字符串检查重复,这种方法在接近所有可能的无重复4位数(总共有10×9×8×7=5040个)时,会频繁生成重复的数,效率极低,完全没必要。
内容的提问来源于stack exchange,提问作者Caleb Hope
相关产品推荐
相关产品推荐

