看到某公众号有一篇文章:Python中神奇的第三方库:Faker Faker 项目地址 文章大致介绍了一下 Faker 这个库的功能和用法。我对其中随机生成名字的功能比较感兴趣,想看看随着生成的数据逐渐变多,随机生成的名字会不会出现重复,以及重复的概率有多大。
测试过程如下:
每次随机生成的数目 m 的范围和步长分别是 [100, 10000]、100;每次数据生成后求每条名字的重复的次数 n;概率取 n/m;重复步骤 1、2、3、4 十次;取十次概率的均值并画出变化趋势
代码如下:
from faker
import Faker
import math
import numpy
as np
import matplotlib
.pyplot
as plt
from matplotlib
.ticker
import FuncFormatter
def gen_names(epoch
, ite
, sta
=False):
fake
= Faker
(locale
='zh_CN')
total
= 0
names
= {}
for r
in range(epoch
):
for i
in range(ite
):
if (i
+ r
* ite
+ 1)%(int(epoch
* ite
/ 10)) == 0:
if sta
:
print(str(round((i
+ r
* ite
+ 1)/(epoch
* ite
) * 100)) + '%')
name
= fake
.name
()
if name
in names
:
names
[name
] = names
[name
] + 1
else:
names
[name
] = 0
repeats
= 0
for key
in names
:
repeats
= repeats
+ names
[key
]
if sta
:
print('{} iterations {} names each time'.format(epoch
,ite
))
print('%d names' % len(names
))
print('%d repeats' % repeats
)
print('duplicate rate: %.5f' % (epoch
* ite
)))
return round(repeats
/(epoch
* ite
), 4)
array
= np
.zeros
((10,100))
for i
in range(10):
print('{}/10'.format(i
+1))
list_
= []
for j
in range(100,10100,100):
list_
.append
(gen_names
(1, j
))
array
[i
] = list_
data
= np
.mean
(array
, axis
= 0)
def changex(temp
, position
):
return int(temp
* 100)
plt
.gca
().xaxis
.set_major_formatter
(FuncFormatter
(changex
))
plt
.plot
(data
.tolist
(),color
='g')
plt
.savefig
('./test.png', format='png')
举个例子:(10000, 0.4)这个点代表的意思是,用 Faker 库一次随机生成 10000 个名字,有 40% 的名字是重复的
综上:
这个库随机生成名字的数量比较大的时候,重复的概率还是很高的地址生成的真实度也比较低,但是用来测试应该够用了