我创建了一个非常简单的 OpenAI Gym( banana-gym
) 并且想知道我是否应该/如何实现env.seed(0)
。
例如,请参阅https://github.com/openai/gym/issues/250#issuecomment-234126816。
我创建了一个非常简单的 OpenAI Gym( banana-gym
) 并且想知道我是否应该/如何实现env.seed(0)
。
例如,请参阅https://github.com/openai/gym/issues/250#issuecomment-234126816。
在最近的一次合并中,OpenAI gym 的开发者改变了env.seed()
不再调用该方法的行为env._seed()
。相反,该方法现在只是发出警告并返回。我认为如果您想使用此方法设置环境的种子,您现在应该覆盖它。
该env.seed()
函数的文档字符串(可在此文件中找到)提供了以下有关该函数应执行的操作的文档:
Sets the seed for this env's random number generator(s).
Note:
Some environments use multiple pseudorandom number generators.
We want to capture all such seeds used in order to ensure that
there aren't accidental correlations between multiple generators.
Returns:
list<bigint>: Returns the list of seeds used in this env's random
number generators. The first value in the list should be the
"main" seed, or the value which a reproducer should pass to
'seed'. Often, the main seed equals the provided 'seed', but
this won't be true if seed=None, for example.
请注意,与您链接到的问题中的文档和评论似乎暗示的不同,它似乎(对我来说)env.seed()
不应该被自定义环境覆盖。env.seed()
有一个非常简单的实现,它只调用并返回 的返回值env._seed()
,在我看来,这是应该被自定义环境覆盖的函数。
例如,OpenAI gym 的atari 环境有一个自定义_seed()
实现,它设置了(C++
基于 - 的)Arcade Learning Environment 内部使用的种子。
由于您在自定义环境中有random.random()
调用,因此您可能应该实现调用。这样,您的环境的用户可以通过确保使用相同的参数调用您的环境来重现实验。_seed()
random.seed()
seed()
注意:像这样乱用全局随机种子可能是出乎意料的,最好在初始化环境时创建一个专用的随机对象,为该对象提供种子,并确保在需要时始终获取随机数该对象的环境。