der*_*oop 15 python random simulation numpy python-2.7
我正在用Python构建一个小模拟,我想使用Common Random Numbers来减少变化.我知道我必须实现CRN的同步才能工作:
CRN需要同步随机数流,这确保除了使用相同的随机数来模拟所有配置之外,在一种配置中用于特定目的的特定随机数用于所有其他配置中的完全相同的目的.
我想知道我想在模拟中实现它的方式是否有效,或者我是否应该使用不同的方法.
我的模拟有三个不同的类(ClassA,ClassB,ClassC),ClassA对象具有随机传播时间,ClassB对象具有随机服务时间和随机使用率,而ClassC对象具有随机服务时间.当然,每类对象可以有多个实例.
在模拟开始时,我指定一个随机数seed(replication_seed),这样我就可以为每个模拟复制使用不同的种子.
import numpy.random as npr
rep_rnd_strm = npr.RandomState().seed(replication_seed)
Run Code Online (Sandbox Code Playgroud)
然后在每个Class的构造函数中,我rep_rnd_strm用来生成一个种子,用于初始化类实例的随机数流:
self.class_rnd_strm = npr.RandomState().seed(rep_rnd_strm.randint(10000000))
Run Code Online (Sandbox Code Playgroud)
然后self.class_rnd_strm,我用于为类实例所需的每个随机数流生成种子.例如,ClassA的构造函数具有:
self.travel_time_strm = npr.RandomState().seed(self.class_rnd_strm.randint(10000000))
Run Code Online (Sandbox Code Playgroud)
而ClassB的构造函数有:
self.service_time_strm = npr.RandomState().seed(self.class_rnd_strm.randint(10000000))
self.usage_rate_strm = npr.RandomState().seed(self.class_rnd_strm.randint(10000000))
Run Code Online (Sandbox Code Playgroud)
我在这里做的是一个有效的方法来使同步工作,或者我应该做不同的事情?
如果我正确理解了这个问题,那么您正在使用(伪)随机数进行播种,因此您没有同步您的 CRN。
考虑:
self.travel_time_strm = npr.RandomState().seed(seed=self.seed)
self.service_time_strm = npr.RandomState().seed(seed=self.seed)
self.usage_rate_strm = npr.RandomState().seed(seed=self.seed)
Run Code Online (Sandbox Code Playgroud)
其中 self.seed 是每个类设置的实例变量,可能来自关键字参数。
def __init__(self, *args, **kwargs):
self.seed = None
if kwargs.get('seed'):
self.seed = kwargs.get('seed')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
932 次 |
| 最近记录: |