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

时间:2018-10-06 21:46:03

标签: 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 range(10):
        a = np.random.rand()  # necessary!
        res.append(np.random.rand())

    return res

它们基本相同,只是在function_2中,您需要为for循环的每次运行生成一个附加的随机数。

现在

x = function_1(1)
y = function_2(1)
x == y
>>> False

但是,您需要确保两个函数返回的res相同。是否有比将function_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

1 个答案:

答案 0 :(得分:2)

对必须相同的序列使用专用的RandomState:

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)来做到无循环。会更快。