我从网络上收集了许多姓名(不同国家人的名字和姓氏)。有一些国家有关于每个姓氏拥有多少人口的统计数据,如这里所示。
那个日本姓氏列表仅列出前100个。我还有其他列表,例如越南人的前20位,以及其他地方列出的前50或1000位。但是,我有真实的名字列表,其中最多可达1000+个。因此,我可能有2000个日本姓氏,只有100个列出了具有该姓氏的人数。
我想建立一个“faker”库,根据这些统计数据生成逼真的姓名。我知道如何在JavaScript中从加权数组中选择随机元素,因此一旦每个名称的“权重”(拥有该名称的人数)都包含在内,就只需要将其插入该算法中即可。
我的问题是,如何在没有权重的名称上“完成曲线”?也就是说,假设我们从拥有权重的20或100个名称开始,会得到类似指数函数的曲线。然后,我想从剩余未加权的列表中随机选择名称,并为它们赋一个值,使它们在曲线的剩余部分中具有某种逼真的位置。如何完成这项任务?
例如,以下是带权重的越南姓名列表:
为了尝试清晰表达我的意思,下面的黑色方框是提供的数据。虚线框会延伸很长一段时间,但我在这里展示其开头。虚线框是我们将填充到曲线中以使其符合曲线开头形状的部分。
基本上,曲线的左侧是一些最高的值。随着向右移动,它会按照“某种”模式变小。我们只需要粗略地将该模式延续到右侧,这样就可以扩展曲线。
那个日本姓氏列表仅列出前100个。我还有其他列表,例如越南人的前20位,以及其他地方列出的前50或1000位。但是,我有真实的名字列表,其中最多可达1000+个。因此,我可能有2000个日本姓氏,只有100个列出了具有该姓氏的人数。
我想建立一个“faker”库,根据这些统计数据生成逼真的姓名。我知道如何在JavaScript中从加权数组中选择随机元素,因此一旦每个名称的“权重”(拥有该名称的人数)都包含在内,就只需要将其插入该算法中即可。
我的问题是,如何在没有权重的名称上“完成曲线”?也就是说,假设我们从拥有权重的20或100个名称开始,会得到类似指数函数的曲线。然后,我想从剩余未加权的列表中随机选择名称,并为它们赋一个值,使它们在曲线的剩余部分中具有某种逼真的位置。如何完成这项任务?
例如,以下是带权重的越南姓名列表:
Nguyen,38
Tran,11
Le,9.5
Pham,7.1
Huynh,5.1
Phan,4.5
Vu,3.9
Đang,2.1
Bui,2
Do,1.4
Ho,1.3
Ngo,1.3
Duong,1
Ly,0.5
这是一个没有权重的列表:
An
Ân
Bạch
Bành
Bao
Biên
Biện
Cam
Cảnh
Cảnh
Cao
Cái
Cát
Chân
Châu
Chiêm
Chu
Chung
Chử
Cổ
Cù
Cung
Cung
Củng
Cừu
Dịch
Diệp
Doãn
Dũ
Dung
Dư
Dữu
Đái
Đàm
Đào
Đậu
Điền
Đinh
Đoàn
Đồ
Đồng
Đổng
Đường
Giả
Giải
Gia
Giản
Giang
Giáp
Hà
Hạ
Hậ
Hác
Hàn
Hầu
Hình
Hoa
Hoắc
Hoạn
Hồng
Hứa
Hướng
Hy
Kha
Khâu
Khổng
Khuất
Kiều
Kim
Kỳ
Kỷ
La
Lạc
Lai
Lam
Lăng
Lãnh
Lâm
Lận
Lệ
Liên
Liêu
Liễu
Long
Lôi
Lục
Lư
Lữ
Lương
Lưu
Mã
Mạc
Mạch
Mai
Mạnh
Mao
Mẫn
Miêu
Minh
Mông
Ngân
Nghê
Nghiêm
Ngư
Ngưu
Nhạc
Nhan
Nhâm
Nhiếp
Nhiều
Nhung
Ninh
Nông
Ôn
Ổn
Ông
Phí
Phó
Phong
Phòng
Phù
Phùng
Phương
Quách
Quan
Quản
Quang
Quảng
Quế
Quyền
Sài
Sầm
Sử
Tạ
Tào
Tăng
Tân
Tần
Tất
Tề
Thạch
Thai
Thái
Thang
Thành
Thảo
Thân
Thi
Thích
Thiện
Thiệu
Thôi
Thủy
Thư
Thường
Tiền
Tiết
Tiêu
Tiêu
Tô
Tôn
Tôn
Tông
Tống
Trác
Trạch
Trại
Trang
Trầm
Trâu
Trì
Triệu
Trịnh
Trương
Từ
Tư
Tưởng
Úc
Ứng
Vạn
Văn
Vân
Vi
Vĩnh
Vũ
Vũ
Vương
Vưu
Xà
Xầm
Xế
Yên
我希望能够对列表进行随机排序(很容易实现),然后为每个项目分配一个权重,以便在一定程度上填充曲线的尾部,让它看起来更具现实感。这该怎么做?基本上似乎需要获得初始加权曲线的“曲率”,然后通过新项目进行扩展。它不需要完美,但无论如何都要尽可能地接近。我不是统计/数学人员,所以我真的不知道从哪里开始。
我没有一个确切的想法,我只是希望有些东西可以在一定程度上产生曲线的尾部。例如,列表的开头可能像这样:
An,0.5
Ân,0.45
Bạch,0.42
Bành,0.40
Bao,0.39
...
为了尝试清晰表达我的意思,下面的黑色方框是提供的数据。虚线框会延伸很长一段时间,但我在这里展示其开头。虚线框是我们将填充到曲线中以使其符合曲线开头形状的部分。
▐
▐
▐▐
▐▐
▐▐
▐▐▐
▐▐▐
▐▐▐▐
▐▐▐▐▐▐
▐▐▐▐▐▐▐▐▐▐
▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐
▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐░░░░
▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐░░░░░░░░░░░░░░░░░░░░░
▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
基本上,曲线的左侧是一些最高的值。随着向右移动,它会按照“某种”模式变小。我们只需要粗略地将该模式延续到右侧,这样就可以扩展曲线。