我正在尝试创建一个接受两个列表的程序。第一个列表是任意数字,第二个列表是输出数字的概率。该程序将询问有关数字和概率的输入。然后程序合并这两个,以便它们相互映射。然后,程序应根据输入的概率返回一个数字。
我已经创建了这个程序,它只是有一个问题,我怎么能得到它,以便在概率列表中,你可以输入浮点数(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.
答案 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