2016-09-19 23 views
0

私はPythonで2つのイテレータを持っており、どちらも同じ「ランダム」分布(どちらもパラレルで実行する必要があります)に従ってください。例えば:並列ランダム分布

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

だけ変数に1つの歩留まりを割り当て、あなたが同じ繰り返しの2つのコピーが必要な場合は二回 – iScrE4m

+0

その変数を使用し、 ' – jonrsharpe

+0

はなぜ1を生成し、他にそれをコピーしないitertools.tee'でしょうか? – 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

2つの 'Iter'クラスを宣言する理由は何もありません - なぜ同じ種の' Iter1'の2つのインスタンスを作成しないのですか? –

0

ランダムな世代番号をこのように制御する方法はありません。あなたがそれをしたい場合は、独自のランダム関数を作成する必要があります。しかし、別のニシキヘビと簡単な方法として、あなただけの1つのオブジェクトを作成することができますし、あなたのランダムな配列のために、同じ結果を有することに、あなたのイテレータオブジェクトをコピーするために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)]