2017-01-12 29 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' 

如果最後兩個輸出不是同一個名稱,考慮到它們具有相同的種子?

相比之下,內置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實例共享一個RNG。不知道這是否是故意的。它看起來錯了。 – user2357112

+0

@ user2357112這看起來像是對我的回答。 – glibdud

+0

@ user2357112糟糕,沒有看到您的評論。 –

回答

1

據我所知,faker種子的全球種子。這很好,但這意味着第二個戰鬥機正在拉動一個全球隨機數,所以就像你向第一個戰鬥機要求第二個名字一樣。

+0

的確,'Generator'類的'seed'方法只是簡單地調用'random.seed()'。可能爲了按照我所描述的方式工作,'Generator'應該有它自己的'random.Random()'實例(通過合成或繼承)並將其種子。 –

+0

@KurtPeek我認爲修改代碼的做法很簡單。這是github,我相信作者會歡迎這個補丁。 –