Python 随机洗牌

2024 年 8 月 29 日 | 5 分钟阅读

Python 的 random 包有一个内置函数 shuffle()。可以使用它来打乱序列(例如列表或元组)。在 Python 中,打乱意味着更改集合中元素的索引。

random.shuffle() 的语法

我们使用 shuffle() 函数来随机更改任何可迭代对象的元素索引。此函数不返回新列表。它会修改原始列表。

shuffle() 函数的语法

函数参数

sequence: 可以接受任何 Python 可迭代对象。

function: 此参数是可选的。此函数的默认值为 random() 函数。如果我们传递一个用户定义的函数,则该函数必须返回一个在 (0, 1] 范围内的值。

返回值: 此函数不返回任何内容。

shuffle() 函数示例

打乱列表

代码

输出

The original list is as follows:
[1, 2, 3, 4, 5, 6]
After shuffling the list the first time:
[4, 3, 1, 6, 5, 2]
After shuffling the list a second time:
[5, 6, 4, 2, 1, 3]

使用用户定义的函数打乱列表

代码

输出

The original list is as follows:
[1, 2, 3, 4, 5, 6]
After shuffling the list the first time:
[1, 6, 2, 5, 3, 4]
After shuffling the list a second time:
[1, 6, 2, 5, 3, 4]

不就地随机打乱

众所周知,Python shuffle() 函数就地操作给定的集合,并且不返回任何内容或返回 None,这意味着它会随机重新排列原始列表的元素并修改其内存位置。但是,我们通常需要保留原始列表或集合。

现在描述的方法允许我们保留原始列表并获得一个打乱的列表。此替代方法返回一个新创建的、已打乱的列表,而不是修改原始列表。

在修改顺序之前,我们将复制原始列表以进行保存。

代码

输出

The original list is as follows:
[1, 2, 3, 4, 5, 6]
After shuffling the list:
[5, 2, 6, 4, 3, 1]

同时按相同顺序打乱两个列表

假设我们有两个 Python 列表。我们需要打乱这两个列表以保持打乱的顺序。例如,一个列表包含字母,另一个列表包含对应的数字。让我们看看如何打乱两个列表并保持它们的顺序。

代码

输出

The first list:  ['a', 'b', 'c', 'd', 'e']
The second list:  [1, 2, 3, 4, 5]
The first list after shuffling:  ('c', 'e', 'a', 'd', 'b')
The second list after shuffling:  (3, 5, 1, 4, 2)

打乱 NumPy 多维数组

Python 的 Numpy 模块有一个名为 numpy.random 的包。该包用于生成随机数据。在此示例中,我们将使用 Python 的 Numpy 模块创建一个二维数组。然后我们将使用 numpy.random.shuffle() 函数来打乱这个多维数组。

代码

输出

The original 2D array
[[ 1  3]
 [ 5  7]
 [ 9 11]
 [13 15]
 [17 19]
 [21 23]]
The shuffled 2D array
[[13 15]
 [ 1  3]
 [21 23]
 [17 19]
 [ 9 11]
 [ 5  7]]

打乱一个项目并每次获得相同的结果

在本节中,我们将看到如何使用 random 包的 seed 方法来打乱列表,以便每次调用 shuffle 函数时,它都会以相同的顺序打乱原始列表。因此,每次打乱后,我们都会得到相同的列表。

伪随机数生成器 (PRNG) 如何工作?

Python 的 random 库并非完全随机。它使用一种称为伪随机数生成器 (PRNG) 的方法。这意味着它是一个确定性系统。random 模块的 seed 值是随机数生成的基础。默认情况下,random 包将当前系统时间作为其 seed 值。我们可以更改此 seed 值,从而更改 random.shuffle() 函数的输出。让我们看看如何使用此值。

代码

输出

The original list is: 
[1, 3, 5, 7, 9, 11, 13, 15]
The shuffled list is: 
[3, 13, 11, 9, 15, 1, 5, 7]
The shuffled list is: 
[3, 13, 11, 9, 15, 1, 5, 7]
The shuffled list is: 
[3, 13, 11, 9, 15, 1, 5, 7]
The shuffled list is: 
[3, 13, 11, 9, 15, 1, 5, 7]

下一主题Python 新特性