基于概率从python列表中选择元素
我正在创建一个python脚本,从这里的男性名字列表中随机挑选1000个名字: 这一切都很好,但我希望它的名称是根据人口普查文本文件(第二列)提供的概率列选择的 在过去的几个小时里,我一直在想这个问题,但我没有取得任何真正的进展,甚至没有找到其他答案基于概率从python列表中选择元素,python,Python,我正在创建一个python脚本,从这里的男性名字列表中随机挑选1000个名字: 这一切都很好,但我希望它的名称是根据人口普查文本文件(第二列)提供的概率列选择的 在过去的几个小时里,我一直在想这个问题,但我没有取得任何真正的进展,甚至没有找到其他答案 有人能帮我吗,或者给我指出正确的方向吗?提前感谢:)加权选择的简单算法是: 为每个名称分配其相对概率,使所有概率之和为1。这个相对值称为“重量” 选择一个介于0和1之间的随机数 在单子上走走,边走边从你的数字中减去每件物品的重量 当转到0或以下时,
有人能帮我吗,或者给我指出正确的方向吗?提前感谢:)加权选择的简单算法是:
请注意,具有更好的计算复杂性,但对于仅选择1000项来说,这对您的用例可能不是很重要。一个快速且非常脏的hack,适用于较小的数据集,只需将所讨论的名称添加到与加权分布相等的次数即可。请注意,这将消耗一吨内存,特别是在较大的数据集中,因此将其视为仅对小加权分布的快速实现。
import random
filename = r"location/of/file"
data = list() # accumulator
with open(filename) as in_:
for line in in_:
name, prob, *_ = line.split()
for _ in range(int(float(prob)*1000)):
data.append(name)
print(random.choice(data))
这可能会有帮助-Eli Bendersky在Python中的页面信息量很大。@DSM该页面非常有用。非常感谢。这可能行得通,但问题是(可能)我从1200个名字中选择了1000次。那么,这种方法需要很长时间吗?你不可能比这快得多:它以几乎最小的常数因子在线性时间内运行。显然,在进行随机挑选之前,权重只计算一次
import random
filename = r"location/of/file"
data = list() # accumulator
with open(filename) as in_:
for line in in_:
name, prob, *_ = line.split()
for _ in range(int(float(prob)*1000)):
data.append(name)
print(random.choice(data))