Python的random模块详解(第7节)


random模块详解

在Python编程中,随机数生成是许多应用程序的基础操作之一。random模块是一个经常用于生成随机数的模块,它提供了许多函数,可以生成不同类型的随机数,如整数、浮点数、随机序列等,还可以用于生成随机字符串、洗牌、抽样等随机操作。在模拟数据、游戏开发、密码学等领域,random模块的使用非常广泛。

1、random.random()函数

random.random()函数是random模块最基础的功能之一,它生成一个0到1之间的随机浮点数。例如:

动手练一练:

import random

print("第一次:", random.random())
print("第二次:", random.random())

执行以上代码,输出结果为:

第一次 0.9706017499764218
第二次 0.4207259149867135

上面的例子中,每次运行得到的结果都是不一样的。这个函数在很多情况下都很有用,比如生成随机数、模拟随机事件等。

2、random.randint()函数

random.randint()函数用于生成一个指定范围内的整数

动手练一练:

import random

print("第一次:", random.randint(1, 50))
print("第二次:", random.randint(1, 50))
print("第三次:", random.randint(1, 50))
# 错误 print("第四次:", random.randint(50, 1))

执行以上代码,输出结果为:

第一次 41
第二次 48
第三次 32

上面的例子中,每次运行得到的结果也都是不一样的。这里需要注意的是,传入的两个参数必须是整数,而且第一个参数一定要比第二个参数小,否则,Python解释器会输出错误信息:“ValueError: empty range for randrange() ”(值错误:randrange() 的范围为空)。

3、random.uniform()函数

random.uniform()函数用于生成一个指定范围内的随机浮点数。例如:

动手练一练:

import random

print("第一次:", random.uniform(1, 50))
print("第二次:", random.uniform(2.5, 4.8))
print("第三次:", random.uniform(50, 40))
print("第四次:", random.uniform(-20, 40))

执行以上代码,输出结果为:

第一次 9.00072151073187
第二次 3.534322307986529
第三次 46.30500695853068
第四次 -0.6742589627752267

上面的例子中,每次运行得到的结果也都是不一样的。传入的两个参数可以是任意的数字包括整数,浮点数,负数。

4、random.choice()函数

random.choice()函数可以从给定的序列中随机选择一个元素返回。例如:

动手练一练:

import random

a = (5, 7, 16, 39, 57)
b = ["Orange", "Apple", "Banana", "Apple", "Cherry"]
c = "python"
print(random.choice(a))
print(random.choice(b))
print(random.choice(c))

执行以上代码,输出结果为:

7
Banana
h

上面的例子中,给定的序列包括列表, 元组, 字符串。

5、random.sample()函数

random.sample()函数可以从指定序列中随机获取指定长度的片断。注意,random.sample()函数不会修改原有序列。

动手练一练:

import random

a = ["Orange", "Apple", "Banana", "Apple", "Cherry"]
print(random.sample(a, 2))
print(random.sample(a, 3))

执行以上代码,输出结果为:

['Orange', 'Banana']
['Apple', 'Apple', 'Cherry']

6、random.randrange()函数

random.randrange()函数生成一个在指定范围内以指定步长递增的随机整数,例如:

动手练一练:

import random

print(random.randrange(0, 20))
print(random.randrange(0, 20, 2))
print(random.randrange(0, 20, 3))
print(random.randrange(0, 20, 5))

执行以上代码,输出结果为:

8
18
12
10

上面的例子中,random.randrange(0, 20)中没有传入第三个参数,则默认步长为“1”,随机生成[0,20]范围内一个整数。random.randrange(0, 20, 2)中传入第三个参数以指定步长为“2”,即生成[0,20)范围内的随机偶数(也就是2的倍数),包括“0”,但不包括“20”。

7、random.shuffle()函数

random.shuffle()函数用于将指定序列中的元素随机打乱顺序。例如:

动手练一练:

import random

a = list(range(1, 8))  # list()函数创建一个由1~7组成的列表,不包括8
b = ["Orange", "Apple", "Banana", "Apple", "Cherry"]

print("-----打乱前-----")
print(a)  # 输出 [1, 2, 3, 4, 5, 6, 7]
print(b)  # 输出 ['Orange', 'Apple', 'Banana', 'Apple', 'Cherry']

random.shuffle(a)
random.shuffle(b)

print("-----打乱后-----")
print(a)  # 输出 [1, 5, 3, 6, 2, 4, 7]
print(b)  # 输出 ['Banana', 'Apple', 'Cherry', 'Orange', 'Apple']

执行以上代码,输出结果为:

-----打乱前-----
[1, 2, 3, 4, 5, 6, 7]
['Orange', 'Apple', 'Banana', 'Apple', 'Cherry']
-----打乱后-----
[1, 5, 3, 6, 2, 4, 7]
['Banana', 'Apple', 'Cherry', 'Orange', 'Apple']

这里需要注意的是,random.shuffle()函数会修改原来的序列,所以原来的序列必须是可修改的,因此元组等类型不能作为random.shuffle()函数的参数使用。

8、random.seed()函数

random.seed()函数俗称为随机数种子。如果不设置随机数种子,我们每次随机抽样得到的数据都是不一样的。设置了随机数种子,能够确保每次抽样的结果一样。例如:

动手练一练:

import random

# 不传入参数值时,产生的随机数是不一样的
print("-------不传入参数值-------")
random.seed()
print("seed()不传入参数值:", random.random())
random.seed()
print("seed()不传入参数值:", random.random())

# 设置参数值为1,产生的随机数一样
print("-------设置参数值为1-------")
random.seed(1)
print("seed(1)传入参数值:", random.random())
random.seed(1)
print("seed(1)传入参数值:", random.random())
random.seed(1)
print("seed(1)传入参数值:", random.random())

# 改变参数值为2,产生的随机数也会发生变化
print("-------改变参数值为2-------")
random.seed(2)
print("seed(2)改变参数值:", random.random())
random.seed(2)
print("seed(2)改变参数值:", random.random())

print("-------再次把参数值改为1-------")
random.seed(1)
print("seed(1)参数值再次改为1:", random.random())

执行以上代码,输出结果为:

-------不传入参数值-------
seed()不传入参数值: 0.5174558211505319
seed()不传入参数值: 0.4396472431539268
-------设置参数值为1-------
seed(1)传入参数值: 0.13436424411240122
seed(1)传入参数值: 0.13436424411240122
seed(1)传入参数值: 0.13436424411240122
-------改变参数值为2-------
seed(2)改变参数值: 0.9560342718892494
seed(2)改变参数值: 0.9560342718892494
-------再次把参数值改为1-------
seed(1)参数值再次改为1: 0.13436424411240122

上面的例子中,random.seed()如果没有传入参数,则我们每次随机抽样得到的数据都是不一样的。当我们预先使用random.seed(x)设定好种子之后(注意:其中的x可以是任意数字),每次生成的随机数都会是相同的。random.seed()括号里的数字,相当于一把钥匙,对应一扇门,同样的数值能够使得抽样的结果一致。