2017-01-12 2 views
1

fakerモジュールのseedメソッドが期待通りに機能していないようです。例:Pythonの "faker"モジュールが期待通りに動作しないため、発電機をシードする

In [1]: import faker 

In [2]: fake1 = faker.Faker() 

In [3]: fake1.seed(0) 

In [4]: fake2 = faker.Faker() 

In [5]: fake2.seed(0) 

In [6]: fake1.name() 
Out[6]: u'Norma Fisher' 

In [7]: fake2.name() 
Out[7]: u'Jorge Sullivan' 

最後の2つの出力が同じ名前でなくても、同じシードを持つとしますか?

比較すると、内蔵のrandomモジュールは、このように動作しない:

In [1]: import random 

In [2]: rand1 = random.Random() 

In [3]: rand1.seed(0) 

In [4]: rand2 = random.Random() 

In [5]: rand2.seed(0) 

In [6]: rand1.random() 
Out[6]: 0.8444218515250481 

In [7]: rand2.random() 
Out[7]: 0.8444218515250481 

なぜfakerは同様に動作しないのですか?

+5

[source](https://github.com/joke2k/faker/blob/03684c9659c423f689918c0054a923771f097c8f/faker/generator.py)は、すべてのFakerインスタンスが1つのRNGを共有していることを示しています。それが熟考されているのかどうかはわかりません。それは間違っています。 – user2357112

+0

@ user2357112それは私の答えのようです。 – glibdud

+0

@ user2357112あなたのコメントはありませんでした。 –

答えて

1

私が作った限り、fakerは、グローバルシードをシードします。これは問題ありませんが、第2フェイザーがグローバルな乱数を引っ張っていることを意味します。つまり、第1フェイカーに第2の名前を求めるのと同じです。

+0

実際、 'Generator'クラスの' seed'メソッドは単に 'random.seed()'を呼び出します。おそらく、私が記述した方法で動作するために、 'Generator'は' random.Random() 'の独自のインスタンスを(合成または継承を介して)持たなければなりません。 –

+0

@ KurtPeek私はそうするためにコードを変更することは自明ではないと思います。それはgithubだ、私は作者がパッチを歓迎すると確信している。 –

関連する問題