为简单起见,我们假设一个函数接收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()
之前对数组进行洗牌?
有更好的方法吗?也许我错过了一些明显的东西,或者这是正确的吗?
谢谢
答案 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)