2016-09-19 80 views
0

我有两个python迭代器,两者应该遵循相同的“随机”分布(两者应该并行运行)。例如:并行随机分配

class Iter1(object): 
    def __iter__(self): 
     for i in random_generator(): 
      yield i 

class Iter2(object): 
    def __iter__(self): 
     for i in random_generator(): 
      yield i 

for el1, el2 in zip(Iter1(), Iter2()): 
    print '{} {}'.format(el1, el2) 

输出应该somethig像:

0.53534 0.53534 
0.12312 0.12312 
0.19238 0.19238 

我怎样才能在某种程度上定义random_generator(),它创造了两个迭代器相同的随机分布并行

注:

  • 他们应该在平行
  • 跑,我不能预先生成(它是一个流,所以我不知道该序列的大小)的序列

谢谢。

+0

只是分配一个收益率的变量,并使用该变量两次 – iScrE4m

+0

如果您需要在同一个迭代的两个副本,使用'itertools.tee' – jonrsharpe

+0

为什么不产生一个并将其复制到另一个? – Jeon

回答

2

指定同一种子的random_generator每个呼叫:

import random 

def random_generator(l, seed=None): 
    r = random.Random(seed) 
    for i in range(l): 
     yield r.random() 


class Iter1(object): 
    def __init__(self, seed): 
     self.seed = seed 

    def __iter__(self): 
     for i in random_generator(10, self.seed): 
      yield i 


class Iter2(object): 
    def __init__(self, seed): 
     self.seed = seed 
    def __iter__(self): 
     for i in random_generator(10, self.seed): 
      yield i 


# The seed can be any hashable object, but don't use None; that 
# tells random.seed() to use the current time. But make sure that 
# Python itself isn't using hash randomization. 
common_seed = object() 
for el1, el2 in zip(Iter1(common_seed), Iter2(common_seed)): 
    print '{} {}'.format(el1, el2) 
+0

您确定这是否适合?我期望从每个数字中得到不同的数字,因为他们从相同的底层数据流中获取数字。 – jonrsharpe

+0

当我开始时,我不打算使用全局函数'random'并实例化一个新的'Random'对象,但是当我注意到'seed'也是一个全局函数时,我很兴奋。我应该重新做这件事。 – chepner

+0

我没有看到任何理由在此声明两个'Iter'类 - 为什么不只是用相同的种子创建'Iter1'的两个实例? –

0

以这种方式无法控制随机世代数。如果你想这样做,你应该创建你自己的随机函数。但作为其他Python的更简单的方法,你可以只创建一个对象,并使用itertools.tee为了你的迭代器对象复制到具有您的随机序列相同的结果:

In [28]: class Iter1(object): 
      def __init__(self, number): 
       self.number = number 
      def __iter__(self): 
       for _ in range(self.number): 
        yield random.random() 
    ....:     

In [29]: 

In [29]: num = Iter1(5) 

In [30]: from itertools import tee 

In [31]: num, num2 = tee(num) 

In [32]: list(zip(num, num2)) 
Out[32]: 
[(0.485400998727448, 0.485400998727448), 
(0.8801649381536764, 0.8801649381536764), 
(0.9684025615967844, 0.9684025615967844), 
(0.9980073706742334, 0.9980073706742334), 
(0.1963579685642387, 0.1963579685642387)]