我创建了一个非常简单的OpenAI健身房(banana-gym
)并想知道我是否应该如何实施env.seed(0)
。
例如,请参阅https://github.com/openai/gym/issues/250#issuecomment-234126816。
答案 0 :(得分:1)
env.seed()
函数的文档字符串(可在this file中找到)提供了有关应该实现的函数的以下文档:
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健身房atari environments有一个自定义_seed()
实现,用于设置由基于(C++
的)街机学习环境内部使用的种子。
由于您在your custom environment中进行了random.random()
来电,因此您应该实施_seed()
来致电random.seed()
。这样,您的环境用户可以通过确保使用相同的参数在您的环境中调用seed()
来重现实验。
注意:使用这样的全局随机种子进行混乱可能会出乎意料,但是当您的环境初始化时,创建一个专用的随机对象可能会更好,播种该对象,并确保如果您在该对象的环境中需要它们,请始终获取随机数。
答案 1 :(得分:0)
在最近的merge中,OpenAI健身房的开发人员将env.seed()
的行为更改为不再调用方法env._seed()
。相反,该方法现在只发出警告并返回。我想如果您想使用此方法来设置环境的种子,您应该立即覆盖它。