Python random.seed()函数用于初始化伪随机数发生器的教程

1,299 阅读7分钟

在这个Python教程中,你将学习如何使用random.seed()函数来初始化伪随机数发生器,以便每次生成相同的随机数据。

实际上计算机并不能生成真正的随机数,它使用一个种子值作为基数或起点来生成随机数。种子值作为一个伪随机数发生器,如果种子值保持不变,计算机将一次又一次地生成相同的随机数。

当我们使用Random模块生成一个随机数时 **random.randint()**随机模块使用计算机的种子值作为生成随机数的基础。

第一个种子值通过使用计算机系统的时间戳来确定,然后当前生成的随机数成为下一个随机生成器数值的种子值。

Python随机模块提供了 ***seed()***函数,它允许我们为随机数发生器设置种子值。通过将种子值设置为一个常数,我们可以生成相同的随机数,并从一个列表或范围中挑选相同的随机项。

什么是Python中的随机种子

为了生成一个随机数,Python的随机模块使用一个种子值,它也被称为随机数发生器。种子值一般由操作系统的当前时间戳(当前系统时间)决定。

种子值作为生成随机数或随机值的起点或基础值。

虽然种子值是由操作系统本身自动设置的,但我们也可以使用 **random.seed()**函数将其设置为一个常数。

通过将其设置为一个常量值,我们可以一次又一次地生成相同的随机数,或者一次又一次地从列表中挑选相同的随机项目。

在我们学习如何使用 **random.seed()**函数之前,我们先讨论一下为什么以及何时使用它?

什么时候以及为什么在Python中使用random.seed()?

当我们想生成随机的安全加密密钥时,种子值是非常重要的,在这里我们不仅仅是依赖操作系统建议的自动种子值。我们把我们自己的自定义种子值用来初始化一个安全和稳健的伪随机数发生器。

这里有一个 **random.seed()**函数。这个函数允许我们设置一个自定义的种子值,生成一个伪随机数发生器,作为生成随机数的基础值。

通过设置一个自定义的种子值,我们有一个可预测的随机数来源,而这个来源只有我们自己知道。

random.seed()的语法

import random 

random.seed(a=None, version=2)

random seed()函数可以接受两个参数值,而且都是可选的。

参数

a: 它就是种子值。默认情况下,它的值是无,所以它使用操作系统的当前系统时间。

版本。 它也是一个可选的参数,默认值为2。在版本2中,指定的种子str、字节和字节数组对象会被转换为int。

使用random.seed()每次都生成相同的随机数

通过将random.seed()值设置为一个常数,我们可以每次都生成相同的数字。

例子

import random

#set the random seed to constant number 4
random.seed(4)

##generate a random number
print("random number 1:", random.randint(1,10000))

#set the random seed to constant number 4
random.seed(4)

##generate a random number
print("random number 2:", random.randint(1,10000))

输出

random number 1: 3868
random number 2: 3868

在我们执行任何随机生成的操作后,种子数会自动设置为不同的值。

所以为了生成相同的随机数,我们必须在每次生成随机数之前将种子值设置为一个常数。

如果我们在调用 ***randint()***函数两次,然后再调用 ***seed()***函数之前,我们将不会得到相同的随机数。

例子

import random

#set the random seed to constant number 4
random.seed(4)

##generate a random number
print("random number 1:", random.randint(1,10000))

##generate a random number
print("random number 2:", random.randint(1,10000))

输出

random number 1: 3868
random number 2: 4970

这里你可以看到,随机数2是完全随机的,这是因为种子值被设置为不同的东西。

获取随机发生器使用的种子值

Python不在内存中存储种子值,它是在每次调用生成某个随机数时自动生成的。Python也没有提供任何方法或属性来获取当前的种子值。

所以为了获得种子值,我们必须将我们的自定义种子值保存在一个Python标识符中,这样我们就可以在整个程序中重复使用这个种子值。

例如,我们想在程序中的特定情况下产生相同的随机结果,在调用任何随机操作之前,我们可以简单地用自定义的seed_value调用种子函数。

例子

import random

import sys

# generate a random seed number between 0 to max number
seed_value = random.randint(0, sys.maxsize)

# print the seed value
print("Your seed value is:", seed_value)

'''
now we can use the seed value anywhere
throughout the program
when we generate the same result
'''
#generate a random number between 100 and 999
#with the custom seed value
#set the seed value
random.seed(seed_value)

print("Random Number 1 (100, 999):",random.randint(100, 999))

random.seed(seed_value)

print("Random Number 2 (100, 999):",random.randint(100, 999))

输出

Random Number 1 (100, 999): 842
Random Number 2 (100, 999): 842

random.seed()函数的常见例子

现在你知道如何使用Python seed()函数了,现在让我们来讨论随机.seed()函数的一些常见使用情况。

例1:使用随机种子从列表中随机选择同一项目。

通过随机选择()函数,我们可以从Python列表中选择一个随机项。随机选择也使用种子值从列表中随机抽取一个随机项。通过在调用函数前将seed()设置为一个常数,我们可以从列表中挑选出相同的项目。 **choice()**函数,我们可以挑选相同的项目。

import random

programming_languages = ['C','C++', 'Java', 'Python', 'JavaScript', 'Ruby', 'Kotlin']

#set the seed value to 50
random.seed(50)
print("Random Programming Language 1:", random.choice(programming_languages))

#again set the seed value to 50
random.seed(50)
print("Random Programming Language 2:", random.choice(programming_languages))

输出

Random Programming Language 1: Python
Random Programming Language 2: Python

例2:使用随机种子从列表中随机选择相同的多个项目。

这个随机 ***sample()***函数允许我们从列表中随机抽取n个项目。类似于 ***random.choice()***方法,该 ***sample()***方法,如果我们在调用该函数之前设置一个自定义的种子值,就可以挑选出相同的项目。

import random

programming_languages = ['C','C++', 'Java', 'Python', 'JavaScript', 'Ruby', 'Kotlin']

#set the seed value to 50
random.seed(50)
print("Random 3 Programming Languages 1:", random.sample(programming_languages,3))

#again set the seed value to 50
random.seed(50)
print("Random 3 Programming Languages 2:", random.sample(programming_languages,3))

输出

Random 3 Programming Languages 1: ['Python', 'Java', 'Ruby']
Random 3 Programming Languages 2: ['Python', 'Java', 'Ruby']

例2:使用随机种子来随机洗刷列表中的相同项。

随机shuffle()函数可以随机洗刷一个列表中的项目。但是通过在洗牌前设置种子值,我们可以得到相同的洗牌结果。

import random

programming_languages = ['C','C++', 'Java', 'Python', 'JavaScript', 'Ruby', 'Kotlin']

#set the seed value to 50
random.seed(50)
random.shuffle(programming_languages)
print("Random shuffle 1:",programming_languages )

'''
redefine the actual order of list
because the order has been shuffled
'''
programming_languages = ['C','C++', 'Java', 'Python', 'JavaScript', 'Ruby', 'Kotlin']

#again set the seed value to 50
random.seed(50)
random.shuffle(programming_languages)
print("Random shuffle 2:",programming_languages )

输出

Random shuffle 1: ['C', 'Kotlin', 'JavaScript', 'C++', 'Ruby', 'Java', 'Python']
Random shuffle 2: ['C', 'Kotlin', 'JavaScript', 'C++', 'Ruby', 'Java', 'Python']

结论

为了生成一个随机数,计算机使用了种子值,它提供了一个生成随机数的起始点或基础。为了确定种子值,随机模块使用默认的操作系统时间系统并将其作为种子值来生成随机数。如果开发者不想使用默认的系统,想用自定义的种子值生成一个可预测的、安全的随机数,随机模块也提供了 seed() 方法。