如何在Python中设置全局随机种子

5

我希望你能像在R语言中一样,为整个脚本/会话全局设置随机种子,而不是每次执行函数或运行模型时都要调用随机种子函数。我知道sci-kit learn使用numpy RNG,但也找不到设置它的全局方法。

我已经阅读了几篇关于此主题的文章,例如这篇: Python中numpy.random和random.random之间的区别

它解释了两个RNG类之间的区别,但没有说明如何全局设置它。

除了每次想要输出相同结果时都调用随机种子,还有没有其他方法可以做到这一点?

## Random Library

import random
##### Random seed given
random.seed(42)
print(random.random()) #will generate a random number 

##### No seed given
print(random.random()) #will generate a random number 

##### Random seed given
random.seed(42)
print(random.random()) #will generate a random number 


#############################

## Numpy Library

import numpy as np

##### Random seed given
np.random.seed(42)
print(np.random.random())

##### No seed given
print(np.random.random())

##### Same seed given
np.random.seed(42)
print(np.random.random())

这不是种子生成器的目的,也不是在R中种子生成器的作用。 - undefined
设置固定的随机数种子的目的是在每次运行程序时获得相同的结果,而不是在程序的单次运行中获得每个随机数调用的相同结果。 - undefined
我知道这可能不是常见的用法,但这对我的情况有帮助。你不能指望团队中的每个人在每次运行函数或脚本时都设置正确的种子。为他们提供一段代码,在每个脚本的开头设置一个全局种子,可以简化事情。 - undefined
除了你还没有理解你所要求的含义之外,你无法对总是落在4上的骰子进行任何有意义的统计分析,也无法对每次调用时重置为相同种子的随机数生成器进行任何有意义的统计分析。当然,能够使用相同的种子两次调用相同的模拟函数并获得相同的结果是很有用的,但你所要求的将在模拟中的每次随机数生成器调用时都重置种子的选项是不存在的。它无法自动判断何时需要重置种子,何时保持不变。 - undefined
解决方案是提高种子管理的能力 - 同时,你应该真正使用本地随机数生成器而不是操纵全局种子。 - undefined
2个回答

0

随机种子测试Python经验性编码

经验性地测试Python全局和局部的随机种子设置。

至少在Colab IPython笔记本中, “全局”随机种子设置不会自动应用于所有函数, 并且在函数中重置随机种子不会改变全局设置。

仅仅导入全局种子设置变量并不能改变这一点。

在每个函数中手动重置随机种子 到所需的种子设置变量, 该变量作为全局导入使用global global_seed, 或作为函数的参数输入导入(global_seed), 将使随机种子在全局范围内表现一致(在所有函数中)。

示例Colab输出:

first print
first Random Number: 82
first Random Number: 82

function_no_reset Random Number before reset: 15
function_no_reset Random Number after: 4

function_no_reset Random Number before reset: 95
function_no_reset Random Number after: 36

function_reset Random Number before reset: 32
function_reset Random Number after: 29

function_reset Random Number before reset: 71
function_reset Random Number after: 10

function_global_seed Random Number before reset: 82
function_global_seed Random Number after: 15

function_global_seed Random Number before reset: 82
function_global_seed Random Number after: 15

last Random Number: 82
last Random Number: 82

代码

import random

print("first print")
# Set the global random seed
global_seed = 42
random.seed(global_seed)
# Generate a random number
random_number = random.randint(1, 100)
# Print the random number along with the function name
print(f"first Random Number: {random_number}")
print(f"first Random Number: {random_number}\n")

# Function to generate and print a random number
def function_no_reset():

    # Generate a random number
    random_number = random.randint(1, 100)
    # Print the random number along with the function name
    print(f"function_no_reset Random Number before reset: {random_number}")

    # Generate a random number
    random_number = random.randint(1, 100)

    # Print the random number along with the function name
    print(f"function_no_reset Random Number after: {random_number}\n")


# Function to generate and print a random number
def function_reset():
    global global_seed

    # Generate a random number
    random_number = random.randint(1, 100)
    # Print the random number along with the function name
    print(f"function_reset Random Number before reset: {random_number}")

    # Generate a random number
    random_number = random.randint(1, 100)

    # Reset the random seed for this function
    random.seed(random_number)

    # Print the random number along with the function name
    print(f"function_reset Random Number after: {random_number}\n")

# Function to generate and print a random number
def function_global_seed():
    global global_seed
    random.seed(global_seed)

    # Generate a random number
    random_number = random.randint(1, 100)
    # Print the random number along with the function name
    print(f"function_global_seed Random Number before reset: {random_number}")

    # Generate a random number
    random_number = random.randint(1, 100)

    # Reset the random seed for this function
    random.seed(random_number)

    # Print the random number along with the function name
    print(f"function_global_seed Random Number after: {random_number}\n")


# Function to generate and print a random number
def function_import_seed(global_seed):
    random.seed(global_seed)

    # Generate a random number
    random_number = random.randint(1, 100)
    # Print the random number along with the function name
    print(f"function_import_seed Random Number before reset: {random_number}")

    # Generate a random number
    random_number = random.randint(1, 100)

    # Reset the random seed for this function
    random.seed(random_number)

    # Print the random number along with the function name
    print(f"function_import_seed Random Number after: {random_number}\n")

# Test the functions
function_no_reset()
function_no_reset()

function_reset()
function_reset()

function_global_seed()
function_global_seed()

function_import_seed(global_seed)
function_import_seed(global_seed)

# Print the random number along with the function name
print(f"last Random Number: {random_number}")
print(f"last Random Number: {random_number}\n")

-2

从整体上看,你的问题与随机数生成器的整个思想相悖(对于获取确定结果有效)。通常情况下,你会想要使用某个值来为随机数生成器设定种子,使其每次执行时都会改变(或者设置不同的数字,例如为某个会话设置一些cookie编号)。例如,当前时间是一个经常使用的种子。之所以不自动发生这种情况,是因为如果你希望,你可以提供一个特定的种子来获得确定性序列。

回到你的问题,如果你想要有全局种子并想要用该种子生成随机数。那么你可以编写一个函数将这两个东西结合在一起,并在需要时调用该函数。

def same_seed_random()
     np.random.seed(42)
     print(np.random.random())

我鼓励你查看此链接以了解更多关于随机种子的信息@ https://pynative.com/python-random-seed/


1
你有默认的后向 - randomnumpy.random 都默认使用一种种子机制,预期在每次运行时产生不同的结果。C语言中的 rand 默认设置为种子1,但是总体而言,C语言的 rand 是相当糟糕的。在Python中手动设置随机数生成器的种子通常是为了产生确定性的结果,与你所说的相反。 - undefined
嗨BlacFurry。谢谢你的回复!是的,确实看起来相反,但那正是我所需要的。 - undefined
抱歉,上一条评论不完整。谢谢你的回复!是的,看起来确实相反,但这正是我所需要的。在我们的团队中,我们共享代码,并尝试使用相同的设置重新运行模型,以便轻松地发现迭代之间的性能提升。还有一些其他伪随机选择,会创建数据子集,我们希望保持不变。如果我理解正确,你建议我只需在一个函数中运行整个脚本,并在该函数中指定种子,这样种子就会在函数的范围内保持不变? - undefined
是的,这对我来说看起来像一个使用案例。如果你正在与团队进行代码共享,那么有一件事情你可以学到。我建议你为这个函数创建一个模块,并在团队中共享。这将使你的项目更具模块化和可扩展性。 - undefined
4
为了进行复制,您通常需要将随机种子设置为固定值。 - undefined
考虑使用np.random.RandomState来创建本地随机状态,而不是依赖副作用或操纵全局状态。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接