Python 基于概率权重随机返回一个值

Python 基于概率权重随机返回一个值,python,probability,Python,Probability,可能重复: 让我们简单地说,一个函数接受4个输入:2个名称及其各自的“偏差/权重”,如何编写一个函数,使其随机返回a或b,但仍将这些权重考虑到随机结果中 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): p

可能重复:

让我们简单地说,一个函数接受4个输入:2个名称及其各自的“偏差/权重”,如何编写一个函数,使其随机返回
a
b
,但仍将这些权重考虑到随机结果中

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()
之前洗牌数组

有更好的方法吗?也许我遗漏了一些明显的东西,或者这是对的


谢谢

这将实现您的目标:

#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#a和p#b都是正数,总和为100
def myRand(a,p_a,b,p_b):
如果随机,则返回a。均匀(0100)

请注意,在只有2个权重的特殊情况下,p_b变得不必要,因为
p_b==100-p_a

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

比率=p_a+pb=100


生成一个介于0和100之间的随机数,如果该数小于10,则使用a=>x,否则使用b=>y

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

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

正如我所说的,正确答案你所做的将起作用,有两个选项和整数权重不会太大,但链接问题中被接受的答案更一般,应该表现得更好。回溯(最后一次调用):文件“randomwalk.py”,第48行,在P=random\u win(P,win\u rate,win\u amount,loss\u amount)文件中“randomwalk.py”,第41行,在random_win return myRand([P+win_amount,P-loss_amount],[win_rate,1-win_rate])文件“randomwalk.py”,第35行,在myRand中表示映射中的n,v(无,i,[sum(w[:x+1]),表示范围内的x(len(w))):TypeError中的x:“NoneType”对象不可调用
inputs = ['e', 'f', 'g', 'h']
weights = [10, 30, 50, 10]

print myRand(inputs, weights)