基于概率从python列表中选择元素

基于概率从python列表中选择元素,python,Python,我正在创建一个python脚本,从这里的男性名字列表中随机挑选1000个名字: 这一切都很好,但我希望它的名称是根据人口普查文本文件(第二列)提供的概率列选择的 在过去的几个小时里,我一直在想这个问题,但我没有取得任何真正的进展,甚至没有找到其他答案 有人能帮我吗,或者给我指出正确的方向吗?提前感谢:)加权选择的简单算法是: 为每个名称分配其相对概率,使所有概率之和为1。这个相对值称为“重量” 选择一个介于0和1之间的随机数 在单子上走走,边走边从你的数字中减去每件物品的重量 当转到0或以下时,

我正在创建一个python脚本,从这里的男性名字列表中随机挑选1000个名字:

这一切都很好,但我希望它的名称是根据人口普查文本文件(第二列)提供的概率列选择的

在过去的几个小时里,我一直在想这个问题,但我没有取得任何真正的进展,甚至没有找到其他答案


有人能帮我吗,或者给我指出正确的方向吗?提前感谢:)

加权选择的简单算法是:

  • 为每个名称分配其相对概率,使所有概率之和为1。这个相对值称为“重量”

  • 选择一个介于0和1之间的随机数

  • 在单子上走走,边走边从你的数字中减去每件物品的重量

  • 当转到0或以下时,选择当前项目

  • 数据文件的第三列是累积概率,即第二列的运行总和

    要选择与累积概率分布相关的随机名称,请执行以下操作:

  • 生成一个介于0和1之间的随机数
  • 找到累积概率大于该值的第一行 随机数
  • 选择该行中的名称


  • 请注意,具有更好的计算复杂性,但对于仅选择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))