Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使numpy.random生成的数字在不同函数中保持一致_Python_Numpy_Random - Fatal编程技术网

Python 使numpy.random生成的数字在不同函数中保持一致

Python 使numpy.random生成的数字在不同函数中保持一致,python,numpy,random,Python,Numpy,Random,假设您有两个类似的函数: import numpy as np def function_1(seed): res = [] np.random.seed(seed) for i in range(10): res.append(np.random.rand()) return res def function_2(seed): res = [] np.random.seed(seed) for i in ra

假设您有两个类似的函数:

import numpy as np


def function_1(seed):

    res = []
    np.random.seed(seed)
    for i in range(10):
        res.append(np.random.rand())

    return res


def function_2(seed):

    res = []
    np.random.seed(seed)
    for i in range(10):
        a = np.random.rand()  # necessary!
        res.append(np.random.rand())

    return res
它们基本相同,只是在
函数_2
中,需要为for循环的每次运行生成额外的随机数

现在,

但是,您需要确保返回的
res
对于这两个函数是相同的。是否有比将
功能_1
更改为以下内容更好的方法

def function_3(seed):

    res = []
    np.random.seed(seed)
    for i in range(10):
        np.random.rand()
        res.append(np.random.rand())

    return res
那么

z = function_3(1)
y == z
>>> True

对必须相同的序列使用专用的随机状态:

def function_2(seed):

    res = []
    random1 = np.random.RandomState(seed)
    for i in range(10):
        a = np.random.rand() # uses global state, no explicit seed
        res.append(random1.rand())

    return res

顺便说一下,您确实应该尝试
res=random1.rand(10)
在不使用循环的情况下执行此操作。它会更快。

对必须相同的序列使用专用的随机状态:

def function_2(seed):

    res = []
    random1 = np.random.RandomState(seed)
    for i in range(10):
        a = np.random.rand() # uses global state, no explicit seed
        res.append(random1.rand())

    return res

顺便说一下,您确实应该尝试
res=random1.rand(10)
在不使用循环的情况下执行此操作。速度会更快。

我该怎么做?我误解了你的问题。你做这件事的方式几乎是最简单的方式。IMO更干净的方法是用
np.random.RandomState
替换
np.random.seed
,我同意。生成np.random.RandomState的两个实例,并在append中使用其中一个实例,在附加随机调用中使用另一个实例。您可以在一个调用之前立即保存该状态,将该状态传递出函数,然后在另一个函数中使用该状态重置。这种方法更加通用和灵活,因此,例如,一个函数不需要对另一个函数了解太多(例如,它调用random的次数);它适用于多个函数,涉及较少的对
随机
的调用等。感谢您的所有建议。我将彻底查看
np.random.RandomState
的文档,并思考什么解决方案最适合我的应用程序。我该怎么做?我误解了你的问题。你做这件事的方式几乎是最简单的方式。IMO更干净的方法是用
np.random.RandomState
替换
np.random.seed
,我同意。生成np.random.RandomState的两个实例,并在append中使用其中一个实例,在附加随机调用中使用另一个实例。您可以在一个调用之前立即保存该状态,将该状态传递出函数,然后在另一个函数中使用该状态重置。这种方法更加通用和灵活,因此,例如,一个函数不需要对另一个函数了解太多(例如,它调用random的次数);它适用于多个函数,涉及较少的对
随机
的调用等。感谢您的所有建议。我将仔细查看
np.random.RandomState
的文档,并考虑什么解决方案最适合我的应用程序。感谢您提供有关指定
random.rand
输出的提示。我只是试图提出一种类似于我实际问题的结构,并认为只要问题得到解决,如果这里的示例效率低下,这就不是问题。感谢您提供了指定
random.rand
输出的提示。我只是试图提出一种与我真正的问题类似的结构,并且认为只要问题得到解决,如果这里的例子是无效的,那就不是问题。