【问题标题】:python: choose element from a list following a certain probabilitypython:按照一定的概率从列表中选择元素
【发布时间】:2017-08-09 20:40:05
【问题描述】:

我正在寻找一个 python 函数,它允许我在给定列表和一定概率的情况下仅返回“通过”彩票的元素。例如:

my_list = ['A', 'B', 'C']
my_probability = 0.66 # The probability for an element to stay in the list
winner = THE_RANDOM_FUNCTION(my_list, my_probability)
print(winner)
>> ['A', 'C'] # Could be a different result but that only an example

所以我希望函数对列表中的每个元素进行一次抽签(以给定的概率),并在它通过抽签时将其保留在结果列表中。

标准库中有这样的功能还是我应该实现它?

【问题讨论】:

  • 你参与这个概率的逻辑是什么?
  • 0.66 是什么意思?
  • 元素“留在”子列表中的概率
  • @McGrady 0.66 表示 66/100。或 33/50。
  • 我猜,OP 的意思是二项式试验。

标签: python python-3.x random probability


【解决方案1】:

听起来您的意思是要选择或不选择每个元素, 以给定的概率。以下是几个简单的解决方案:

filter(lambda x: random.random() < my_probability, my_list)

[x for x in my_list if random.random() < my_probability]

【讨论】:

    【解决方案2】:

    对我来说,这看起来像是一个经典的二项式试验。

    In [1]: import numpy as np
    
    In [2]: my_list = ['A', 'B', 'C']
    
    In [3]: prob = 0.66
    
    In [4]: mask = np.random.binomial(1, prob, len(my_list))
    
    In [5]: selected = [elem for keep, elem in zip(mask, my_list) if keep]
    
    In [6]: selected
    Out[6]: ['A', 'B']
    

    或者你可以走纯粹的 Numpy 方式,如果你不需要最终结果保留一个列表

    In [7]: my_arr = np.array(my_list)
    
    In [8]: my_arr[mask.astype(bool)]
    Out[8]: 
    array(['A', 'B'], dtype='<U1')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      相关资源
      最近更新 更多