基于概率权重随机返回值

时间:2012-08-23 17:10:46

标签: python probability

  

可能重复:
  A weighted version of random.choice

为简单起见,我们假设一个函数接收4个输入:2个名称及其各自的“偏差/权重”,如何编写函数使其返回ab随机但仍将这些权重视为随机结果。

a = 'x'
b = 'y'
p_a = 10
p_b = 90

def myRand(a, p_a, b, p_b):
    return 'x' 10% of the time, 'y' 90% of time

到目前为止我做了什么

import random

def myRand(a, p_a, b, p_b):
    probs = [a]*p_a + [b]*p_b
    return random.choice(probs)

有人能指出为什么这是不正确或不是最佳答案?我的理由是,我假设每个元素被挑选的概率相同,所以结果仍然有利于10:90。或者也许我们可以在使用random.choice()之前对数组进行洗牌?

有更好的方法吗?也许我错过了一些明显的东西,或者这是正确的吗?

谢谢

3 个答案:

答案 0 :(得分:1)

这将完成你想要做的事情:

#assumes p_a and p_b are both positive numbers that sum to 100
def myRand(a, p_a, b, p_b):
   return a if random.uniform(0,100) < p_a else b 

请注意,从p_b == 100-p_a开始,只有2个权重的特殊情况下,p_b变得不必要。

答案 1 :(得分:0)

a ='x'; b ='y'; p_a = 10; p_b = 90

比率= p_a + pb = 100

生成0到100之间的随机数,如果数字小于10,则使用a =&gt; x否则使用b =&gt; y

答案 2 :(得分:0)

我修改了函数以接受任意数量的输入和加权概率,因此如果您以后决定要使用两个以上的输入,则可以。

import random

def myRand(i, w):
    r = random.uniform(0, sum(w))

    # loop through a list of inputs and max cutoff values, returning
    # the first value for which the random num r is less than the cutoff value
    for n,v in map(None, i,[sum(w[:x+1]) for x in range(len(w))]):
        if r < v:
            return n

使用示例:

inputs = ['e', 'f', 'g', 'h']
weights = [10, 30, 50, 10]

print myRand(inputs, weights)