CC++ & Algorithm

Python随机数 random

中等10
语言版本:C++Python
概述:学习如何在Python中生成随机数,就像从袋子里抽签一样,让程序变得不可预测。

让程序学会“抽签”——Python随机数 random 模块详解

你有没有玩过“石头剪刀布”或者“抓阄”游戏?每次出拳或抽签,结果都是不确定的——这就是随机。在Python编程中,如果我们想让程序也拥有这种“不确定”的能力,比如掷骰子、抽奖、猜数字,就需要用到random模块。它就像一个神奇的魔术袋,里面装着各种随机数生成工具,你只要伸手一掏,就能得到意想不到的结果。

使用前,先打开魔法口袋

Python的random模块不是默认就能用的,需要先告诉Python:“我要用这个模块啦!”这就像你要进游乐园,必须先买票一样。在代码最前面写:

import random   # 导入随机数模块

只要写了这一行,后面就能用random里的所有功能了。

三种最常用的“抽签”方式

1. 像掷骰子一样生成随机小数

random.random() 会返回一个0到1之间的小数,比如0.123、0.987。注意:它包含0,但不包含1(数学上记作 [0, 1))。这有什么用?比如你想模拟一个“幸运指数”,从0(完全不幸运)到0.999…(接近幸运满分)。

import random

lucky_value = random.random()   # 生成一个0~1之间的随机小数
print("今天幸运指数是:", lucky_value)   # 可能是0.634...

2. 像抽扑克牌一样生成随机整数

random.randint(a, b) 会返回一个在 [a, b] 之间的整数,包括两端的a和b。就像掷一个六面骰子,可能得到1、2、3、4、5、6中的任意一个。生活里,老师点名时用随机数选学号,或者玩“大富翁”游戏时决定走几步,都可以用这个。

import random

dice = random.randint(1, 6)          # 生成1到6的随机整数,模拟掷骰子
print("你掷出了:", dice)

# 再比如,模拟抽一个班级里的座位号(1~40号)
seat_number = random.randint(1, 40)  # 随机选一个座位号
print("幸运座位是:", seat_number)

3. 像抽名字一样随机选择一个元素

如果你的数据是一个列表(比如全班同学的名单),想随机选一个人,用 random.choice(列表) 最方便。它就像从一堆写着名字的纸条里随机抽一张。

import random

students = ["小明", "小红", "小刚", "小丽"]   # 四个同学的名字
lucky_student = random.choice(students)       # 随机选一个
print("今天被老师点名的同学是:", lucky_student)

# 再比如,从零食袋里随机选一个口味
flavors = ["原味", "番茄味", "烧烤味", "芝士味"]
today_snack = random.choice(flavors)
print("今天吃的薯片口味是:", today_snack)

更多实用的随机函数

除了上面三种,random模块还有几个常用的“进阶”工具,让随机变得更灵活。

random.uniform(a, b):生成指定范围内的随机小数

比如想生成一个1.5到3.8之间的小数(身高、价格、时间),用 uniform 很合适。它和 randint 类似,但返回的是小数,并且包含a和b任意一端(具体看浮点数精度)。

import random

price = random.uniform(10.0, 20.0)   # 生成10.0到20.0之间的随机价格
print("今天的零食价格是:", round(price, 2), "元")  # 保留两位小数

random.randrange(start, stop[, step]):按步长随机选整数

类似于 range,但随机返回其中一个整数。比如你想从0开始,每隔5取一个数(0,5,10,15,…)中随机选一个:

import random

# 在1、3、5、7、9(奇数)中随机选一个
odd_number = random.randrange(1, 10, 2)   # 从1开始到9,步长为2
print("随机奇数:", odd_number)

random.shuffle(列表):把列表里的顺序打乱

就像洗牌一样,把列表中的元素随机重新排列。注意:它会直接修改原列表,不返回新列表。

import random

cards = ["A", "2", "3", "4", "5"]      # 五张扑克牌
random.shuffle(cards)                  # 洗牌,原列表被改变
print("洗牌后:", cards)               # 可能输出 ['3', 'A', '5', '2', '4']

random.sample(列表, k):从列表中随机抽取多个不重复的元素

比如老师要随机选3名同学打扫卫生,用 sample 就可以做到不重复抽取。

import random

students = ["小明", "小红", "小刚", "小丽", "小华"]
chosen = random.sample(students, 3)    # 随机选3个人,不重复
print("被选中的值日生:", chosen)

新手最容易犯的三个错误

  1. 忘记导入模块
    直接写 random.randint(1,6) 会报错 NameError: name 'random' is not defined。必须先写 import random

  2. randint的参数顺序搞反
    random.randint(10, 1) 是不允许的,因为第一个参数必须小于等于第二个参数。如果写反了,Python会报错 ValueError: empty range

  3. 以为random每次都一样
    随机数每次运行都不同,但如果想让测试时每次结果相同,可以用 random.seed() 固定“种子”。否则不要担心,它真的随机。

完整可运行的示例:抽奖转盘游戏

下面是一个综合运用 random 的抽奖游戏。你可以输入自己的名字,然后程序模拟转盘,随机抽取一个奖品。运行看看,每次结果都不一样哦!

import random   # 导入随机数模块

# 奖品列表(可以自由修改)
prizes = ["谢谢参与", "棒棒糖", "铅笔一支", "笔记本", "玩具小汽车", "免作业卡"]

# 输入玩家名字
player_name = input("请输入你的名字:")

# 模拟转盘旋转:随机选一个奖品
index = random.randint(0, len(prizes) - 1)   # 随机生成奖品列表的下标
lucky_prize = prizes[index]                   # 根据下标取出对应奖品

# 输出结果
print("抽奖结果:", player_name, "获得了——", lucky_prize)

# 可选:再抽一次?由你决定!

让随机数“听话”:seed的妙用

有时候我们想调试程序,希望每次运行都出现同样的“随机”结果(比如验证代码逻辑是否正确)。这时可以用 random.seed(n) 给随机数生成器一个“种子”。相同的种子会产生相同的随机数序列。

import random

random.seed(42)   # 设定种子为42
print(random.randint(1, 10))   # 每次运行,这一行都输出相同数字
print(random.random())         # 也是固定的

# 如果去掉 seed,每次结果都不同

注意:只在测试或演示时使用 seed,正常游戏不要加,否则就失去随机性啦。

下一步你可以探索什么?

  • math模块:与数学有关的函数(如求平方根、四舍五入),可以和random结合做更复杂的模拟。
  • 其他随机函数random.gauss() 生成符合正态分布的随机数(比如模拟考试成绩分布)。
  • 海龟画图 + random:用随机数让海龟随机移动,画出意想不到的图案。
  • 游戏编程:用random控制敌人出现、攻击伤害、掉宝概率等。

现在,你已经掌握了Python随机数的核心用法。快去用random给你的游戏、小工具或者学习程序加点“不确定”的惊喜吧!

例题精讲

1单选题

在Python中,以下哪个函数可以生成一个闭区间 [1, 10] 内的随机整数?

Arandom.random()
Brandom.randint(1, 10)
Crandom.uniform(1, 10)
Drandom.randrange(1, 10)
2单选题

执行以下代码,输出结果不可能的是哪一个? import random fruits = ['苹果', '香蕉', '橘子', '葡萄'] print(random.choice(fruits))

A苹果
B香蕉
C
D橘子
3判断题

在Python中,random.random() 函数可以生成一个 0 到 1 之间的随机浮点数,包括 0.0 和 1.0。

4判断题

使用 random.shuffle() 函数可以原地打乱列表的顺序,该函数没有返回值。

5填空题
模拟掷一个六面骰子(点数1~6),输出随机点数。请补全代码:
import random
print(___)