如何确保输出基于输入的数字python

时间:2015-05-06 20:34:49

标签: python list probability

我正在尝试创建一个接受两个列表的程序。第一个列表是任意数字,第二个列表是输出数字的概率。该程序将询问有关数字和概率的输入。然后程序合并这两个,以便它们相互映射。然后,程序应根据输入的概率返回一个数字。

我已经创建了这个程序,它只是有一个问题,我怎么能得到它,以便在概率列表中,你可以输入浮点数(0.1,0.2)。我可以这样做,但然后代码的其他部分返回错误。另外,如果使用浮点数(0.5,0.5),如果使用了浮点数,那么用户输入的概率最多只能加1(如果没有使用浮点数的话)?

pos_values = [] 
probability = []
maxLengthList = 5

while len(pos_values) < maxLengthList:
        number = input("Enter a number: ")
        pos_values.append(number)
        prob = input("Enter a probability: ")
        probability.append(prob)

cumulative_probability = list(zip(pos_values, probability))

prob = [val for val, cnt in cumulative_probability for i in range(cnt)]
outcome = []
for i in range (1):
    outcome.append(random.choice(prob))

print('Possible outcome returned is: ', outcome)

我的代码完全符合我的要求,我的问题是我如何才能使所输入概率的总和超过1或10.

2 个答案:

答案 0 :(得分:0)

这是您需要的代码:

pos_values = []
probability = []
maxLengthList = 5

while len(pos_values) < maxLengthList:
    number = input("Enter a number: ")
    pos_values.append(number)
    prob = input("Enter a probability: ")
    probability.append(prob)

all_values = list(zip(pos_values, probability))

print all_values

prob = [cnt for val, cnt in all_values]
if sum(prob) > 1.0:
    print "Error in probabilities"
else:
    lookup = input("Enter probability to search: ")
    for val, cnt in all_values:
        if cnt == lookup:
            print val

现在,快速分析您的代码:

  • 您不能超越浮动范围,例如range(cnt)

  • range(1)始终输出0,因此在您的代码中无需使用它。 事实上,我想知道在循环中使用它的理性是什么。

答案 1 :(得分:0)

问题在于列表理解。范围的参数必须是整数,否则会引发错误。

实现所需效果的更简单,更pythonic的方法如下:

    def returnRandom(probability_distribution):
        r = random.random()
        for value, prob in probability_distribution:
            r -= prob
            if r <= 0: return value
        print("Error! The total probability was less than one!")

您也可以格式化列表中的概率来存储累积概率,然后代码将自行简化:

    def returnRandom(probability_distribution):
        r = random.random()
        for value, cum_prob in probability_distribution:
            if r <= cum_prob: return value