Python模块:内置模块random随机数生成大全

发布时间:2026/8/1 17:12:15
Python模块:内置模块random随机数生成大全 Python模块内置模块random随机数生成大全一、开篇可控的随机性程序中的随机实际上是伪随机——由确定性的算法生成的数列看起来随机但可复现。Python的random模块基于Mersenne Twister算法提供了丰富的随机数生成功能。⌨️ 基本导入和使用importrandom# random模块的功能分类# - 基本随机random(), uniform(), randint(), randrange()# - 序列操作choice(), choices(), sample(), shuffle()# - 分布函数gauss(), expovariate() 等# - 种子管理seed(), getstate(), setstate()# - 系统随机SystemRandom加密级二、基本随机函数2.1 浮点数和整数随机importrandom# random() —— [0.0, 1.0) 的随机浮点数print(frandom():{random.random():.4f})print(frandom():{random.random():.4f})# uniform(a, b) —— [a, b] 或 [b, a] 的随机浮点数print(funiform(1, 10):{random.uniform(1,10):.2f})print(funiform(10, 1):{random.uniform(10,1):.2f})# 同样有效# randint(a, b) —— [a, b] 的随机整数包含两端print(frandint(1, 6):{random.randint(1,6)})# 模拟骰子print(frandint(1, 6):{random.randint(1,6)})# 模拟掷骰子defroll_dice(n1,sides6):掷n个sides面的骰子return[random.randint(1,sides)for_inrange(n)]print(f掷2个骰子:{roll_dice(2)})print(f掷3个20面骰子:{roll_dice(3,20)})# randrange(start, stop, step) —— 随机从range中选一个print(frandrange(0, 100, 5):{random.randrange(0,100,5)})# 0,5,10,...,952.2 序列随机操作importrandom fruits[苹果,香蕉,橙子,葡萄,西瓜,芒果]# choice(seq) —— 随机选一个元素print(f今日推荐水果:{random.choice(fruits)})# choices(seq, kn) —— 有放回随机选n个可能重复print(f抽3次有放回:{random.choices(fruits,k3)})# 带权重的随机选择weights[0.4,0.2,0.15,0.1,0.1,0.05]# 权重之和为1resultrandom.choices(fruits,weightsweights,k1000)fromcollectionsimportCounterprint(权重采样统计:)forfruit,countinCounter(result).most_common():print(f{fruit}:{count}次)# sample(seq, kn) —— 无放回随机选n个不重复print(f随机抽3个无放回:{random.sample(fruits,k3)})# shuffle(seq) —— 原地打乱序列cardslist(range(1,53))random.shuffle(cards)print(f洗牌后前5张:{cards[:5]})# ⚠️ shuffle是原地操作返回None# shuffled random.shuffle(cards) # shuffled是None三、分布函数importrandom# gauss(mu, sigma) —— 正态分布高斯分布# mu: 均值sigma: 标准差heights[random.gauss(170,10)for_inrange(1000)]avgsum(heights)/len(heights)print(f生成1000人身高均值{avg:.1f}预期170)# 其他分布# random.triangular(low, high, mode) —— 三角分布# random.betavariate(alpha, beta) —— Beta分布# random.expovariate(lambd) —— 指数分布# random.gammavariate(alpha, beta) —— Gamma分布# 这些分布在模拟、统计、机器学习中有特定用途# 日常开发中最常用的是gauss()和uniform()四、随机种子和可复现性4.1 seed()——固定随机性importrandom# seed() —— 设置随机种子# 相同的种子 → 相同的随机序列random.seed(42)print(种子42:)print([random.randint(1,100)for_inrange(5)])# [82, 15, 4, 95, 36]random.seed(42)# 重新设置相同种子print(种子42第二次:)print([random.randint(1,100)for_inrange(5)])# [82, 15, 4, 95, 36] ← 完全相同# 为什么需要可复现的随机# 1. 测试——每次测试用同样的随机数据# 2. 调试——重现bug# 3. 机器学习——对比不同模型的性能数据划分一致# 4. 游戏——用种子生成相同的关卡地图# 不指定种子——每次运行结果不同# random.seed() # 使用系统时间作为种子默认行为# 保存和恢复随机状态staterandom.getstate()# 保存当前状态r1random.randint(1,100)random.setstate(state)# 恢复到保存的状态r2random.randint(1,100)print(fr1{r1}, r2{r2}, 相同:{r1r2})# True4.2 实战可复现的数据划分importrandomdefsplit_train_test(data,test_ratio0.2,seed42):划分训练集和测试集可复现random.seed(seed)shuffleddata.copy()random.shuffle(shuffled)split_pointint(len(data)*(1-test_ratio))trainshuffled[:split_point]testshuffled[split_point:]returntrain,test datalist(range(100))train,testsplit_train_test(data,seed42)print(f训练集:{len(train)}, 测试集:{len(test)})# 再次运行——结果相同train2,test2split_train_test(data,seed42)print(f相同划分:{traintrain2andtesttest2})# True五、实战案例5.1 随机验证码和密码importrandomimportstringdefgenerate_code(length6):生成数字验证码return.join(str(random.randint(0,9))for_inrange(length))defgenerate_password(length12,include_specialTrue):生成随机密码charsstring.ascii_lettersstring.digitsifinclude_special:chars!#$%^*# 确保密码至少包含各类字符password[random.choice(string.ascii_lowercase),random.choice(string.ascii_uppercase),random.choice(string.digits),]ifinclude_special:password.append(random.choice(!#$%^*))# 填充到指定长度password[random.choice(chars)for_inrange(length-len(password))]random.shuffle(password)return.join(password)print(f验证码:{generate_code(6)})print(f密码:{generate_password(12)})5.2 抽奖程序importrandomclassLottery:抽奖系统def__init__(self,prizes,seedNone):self.prizesprizes# {一等奖: 1, 二等奖: 3, ...}self.participants[]ifseedisnotNone:random.seed(seed)defadd_participant(self,name):self.participants.append(name)defdraw(self):进行抽奖winners{}remaininglist(self.participants)forprize_name,countinself.prizes.items():iflen(remaining)count:breakdrawnrandom.sample(remaining,count)winners[prize_name]drawn remaining[pforpinremainingifpnotindrawn]returnwinners lotteryLottery({一等奖:1,二等奖:2,三等奖:5},seed42)foriinrange(1,51):lottery.add_participant(f参与者{i})resultslottery.draw()forprize,winnersinresults.items():print(f{prize}:{, .join(winners)})六、加密级随机数# ⚠️ random模块不适合安全/加密用途# 对于密码、token等场景使用secrets模块importsecrets# 生成加密安全的随机tokentokensecrets.token_hex(16)print(f安全token:{token})# 生成URL安全的tokenurl_tokensecrets.token_urlsafe(16)print(fURL安全token:{url_token})# 安全的随机选择choices[A,B,C]print(f安全随机选择:{secrets.choice(choices)})# 或者使用 random.SystemRandom —— 它使用操作系统的熵源sys_randomrandom.SystemRandom()print(f安全随机数:{sys_random.randint(1,100)})七、总结random模块是日常开发中最常用的模块之一。从生成测试数据到实现随机算法它无处不在。核心要点伪随机——可复现用seed()固定基本函数random(),randint(),choice(),shuffle()分布函数gauss()用于生成正态分布数据安全性random不用于加密用secrets模块✅最常用randint()(随机整数),choice()(随机选取),shuffle()(洗牌),sample()(抽样),seed()(固定随机)