Python:为什么值总是return 0
Python: Why does the value always return 0
我是 python 的新手,我正在努力为学校解决这个问题。
航空公司发现,每个预订座位的乘客没有出现的概率 q 独立于其他乘客。所以航空公司 A 总是出售 n-1 座飞机的 n 张票,而航空公司 B 总是出售 n-2 座飞机的 2n 张票。哪个更经常超额预订?
这是我的代码:
import random
arrive = [True, False]
def airline_a(q, n, sims):
sim_counter = 0
reserved_seats = []
overbooked = 0
for x in range(n):
reserved_seats.append(x)
while sim_counter != sims:
passengers = 0
for x in range(len(reserved_seats)):
success = random.choices(arrive, weights=(100 - (q * 100), q * 100), k=1)
if success == True:
passengers += 1
if passengers > n - 1:
overbooked += 1
sim_counter += 1
print("Results: ")
print(f"Probability that Airline A is overbooked: ", overbooked / sims)
airline_a(.7, 100, 1000)
我应该为航空公司 B 执行类似的功能并比较两个值,但是我遇到了一个问题
问题是输出总是0。我不太明白我做错了什么。
random.choices()
正在返回一个列表,因此它永远不会是 success == True
,因为它正在返回 success == ['True']
。尝试解决这个问题:
success = random.choices(arrive, weights=(100 - (q * 100), q * 100), k=1)[0]
其次,您可能需要稍微调整一下您的功能。你的最大座位数是 100...然后在 100 个中你 select .30 True, .70 False。要超额预订,您需要所有 pasangers 返回 True(这样您就会有乘客 > n -1(即 100 名乘客 > 99)。
您必须将您的 q 更改为非常小的概率(即,一个乘客确实出现的概率很高,这样您就可以得到所有 100 个都出现的情况)。
这样想,如果你抛硬币 100 次,你需要它拿出 100 个正面大于 100-1。如果硬币的重量为您提供 0.30 个正面和 0.70 个反面......虽然理论上它可能会发生(您可以计算出该概率),但您将“永远不会”experimentally/simulate 获得 100 个正面。您需要重量为 0.999 头和 0.001 尾的重量,才能有机会在 100 次投掷中获得 100 次正面。
import random
arrive = [True, False]
def airline_a(q, n, sims):
sim_counter = 0
reserved_seats = []
overbooked = 0
for x in range(n):
reserved_seats.append(x)
alpha = 100 - (q * 100)
beta = q * 100
while sim_counter != sims:
passengers = 0
for x in range(len(reserved_seats)):
success = random.choices(arrive, weights=(alpha, beta), k=1)[0]
if success == True:
passengers += 1
if passengers > n - 1:
overbooked += 1
sim_counter += 1
print("Results: ")
print(f"Probability that Airline A is overbooked: ", overbooked / sims)
airline_a(.001, 100, 1000)
给我输出:
Results:
Probability that Airline A is overbooked: 0.906
你可以通过数学方式解决这个问题,而不是模拟。
您的代码的问题在于这一行:if success == True:
。如果您尝试打印 success
,它会输出 [True]
或 [False]
。您可以通过在 if
语句中获取 success
的第一个值来解决此问题,如下所示:
if success[0] == True:
passengers += 1
并稍微简化代码:
if success[0]:
passengers += 1
将您的代码更改为以下代码以修复错误,但是变量 passengers
的计数将保持在变量 n
以下,结果仍为 0,因此请尝试减少 n 的值或者通过减少 q
:
的值
import random
arrive = [True, False]
def airline_a(q, n, sims):
sim_counter = 0
reserved_seats = []
overbooked = 0
for x in range(n):
reserved_seats.append(x)
while sim_counter != sims:
passengers = 0
for x in range(len(reserved_seats)):
success = random.choices(arrive, weights=(100 - (q * 100), q * 100), k=1)
if success[0]:
passengers += 1
if passengers > n - 1:
overbooked += 1
sim_counter += 1
print("Results: ")
print(f"Probability that Airline A is overbooked: ", overbooked / sims)
airline_a(.7, 100, 1000)
有关 random.choices()
的解释请访问以下 link
代码的主要问题是您试图将列表与布尔值进行比较,因为 random.choice()
函数 return 列表。
所以,首先 你必须取 success
列表的第一个元素:
success = random.choices(arrive, weights=(100 - (q * 100), q * 100), k=1)
if success[0]:
passengers += 1
或
success = random.choices(arrive, weights=(100 - (q * 100), q * 100), k=1)[0]
if success:
passengers += 1
要记住的第二件事,也许是最重要的,就是您将始终收到 0%,这是因为逻辑发展的方式,统计上几乎不可能没有人不出现,只有1个人不出现,在A情况下,不会有人超额预订
示例
我进行了一些测试,修改了一个人不会出现的概率百分比。
我想提一下,0.7
是一个 70%
的概率,并且在这种情况下非常高,这意味着在 100 人中,平均而言,每次模拟的结果都会出现在航班将是 30,这就是为什么从来没有超额预订的人。
除了 0.0%
,我得到的第一个结果是通过设置 q = 0.05
,结果我收到了 0.007
的超额预订概率(即 0.7%
) .
飞机B
我不会给你写模拟B公司案例的方案, 就是修改1行代码, 你最好写, 因为那是作业。但是我也对第二种情况做了一些测试,这里的情况在统计上变得更加有趣。
通过设置 q = 0.4
,我们收到的超额预订概率平均为 0.97
(97%
) 并且 q = 0.5
平均为 0.45
(45%
).
我是 python 的新手,我正在努力为学校解决这个问题。
航空公司发现,每个预订座位的乘客没有出现的概率 q 独立于其他乘客。所以航空公司 A 总是出售 n-1 座飞机的 n 张票,而航空公司 B 总是出售 n-2 座飞机的 2n 张票。哪个更经常超额预订?
这是我的代码:
import random
arrive = [True, False]
def airline_a(q, n, sims):
sim_counter = 0
reserved_seats = []
overbooked = 0
for x in range(n):
reserved_seats.append(x)
while sim_counter != sims:
passengers = 0
for x in range(len(reserved_seats)):
success = random.choices(arrive, weights=(100 - (q * 100), q * 100), k=1)
if success == True:
passengers += 1
if passengers > n - 1:
overbooked += 1
sim_counter += 1
print("Results: ")
print(f"Probability that Airline A is overbooked: ", overbooked / sims)
airline_a(.7, 100, 1000)
我应该为航空公司 B 执行类似的功能并比较两个值,但是我遇到了一个问题 问题是输出总是0。我不太明白我做错了什么。
random.choices()
正在返回一个列表,因此它永远不会是 success == True
,因为它正在返回 success == ['True']
。尝试解决这个问题:
success = random.choices(arrive, weights=(100 - (q * 100), q * 100), k=1)[0]
其次,您可能需要稍微调整一下您的功能。你的最大座位数是 100...然后在 100 个中你 select .30 True, .70 False。要超额预订,您需要所有 pasangers 返回 True(这样您就会有乘客 > n -1(即 100 名乘客 > 99)。
您必须将您的 q 更改为非常小的概率(即,一个乘客确实出现的概率很高,这样您就可以得到所有 100 个都出现的情况)。
这样想,如果你抛硬币 100 次,你需要它拿出 100 个正面大于 100-1。如果硬币的重量为您提供 0.30 个正面和 0.70 个反面......虽然理论上它可能会发生(您可以计算出该概率),但您将“永远不会”experimentally/simulate 获得 100 个正面。您需要重量为 0.999 头和 0.001 尾的重量,才能有机会在 100 次投掷中获得 100 次正面。
import random
arrive = [True, False]
def airline_a(q, n, sims):
sim_counter = 0
reserved_seats = []
overbooked = 0
for x in range(n):
reserved_seats.append(x)
alpha = 100 - (q * 100)
beta = q * 100
while sim_counter != sims:
passengers = 0
for x in range(len(reserved_seats)):
success = random.choices(arrive, weights=(alpha, beta), k=1)[0]
if success == True:
passengers += 1
if passengers > n - 1:
overbooked += 1
sim_counter += 1
print("Results: ")
print(f"Probability that Airline A is overbooked: ", overbooked / sims)
airline_a(.001, 100, 1000)
给我输出:
Results:
Probability that Airline A is overbooked: 0.906
你可以通过数学方式解决这个问题,而不是模拟。
您的代码的问题在于这一行:if success == True:
。如果您尝试打印 success
,它会输出 [True]
或 [False]
。您可以通过在 if
语句中获取 success
的第一个值来解决此问题,如下所示:
if success[0] == True:
passengers += 1
并稍微简化代码:
if success[0]:
passengers += 1
将您的代码更改为以下代码以修复错误,但是变量 passengers
的计数将保持在变量 n
以下,结果仍为 0,因此请尝试减少 n 的值或者通过减少 q
:
import random
arrive = [True, False]
def airline_a(q, n, sims):
sim_counter = 0
reserved_seats = []
overbooked = 0
for x in range(n):
reserved_seats.append(x)
while sim_counter != sims:
passengers = 0
for x in range(len(reserved_seats)):
success = random.choices(arrive, weights=(100 - (q * 100), q * 100), k=1)
if success[0]:
passengers += 1
if passengers > n - 1:
overbooked += 1
sim_counter += 1
print("Results: ")
print(f"Probability that Airline A is overbooked: ", overbooked / sims)
airline_a(.7, 100, 1000)
有关 random.choices()
的解释请访问以下 link
代码的主要问题是您试图将列表与布尔值进行比较,因为 random.choice()
函数 return 列表。
所以,首先 你必须取 success
列表的第一个元素:
success = random.choices(arrive, weights=(100 - (q * 100), q * 100), k=1)
if success[0]:
passengers += 1
或
success = random.choices(arrive, weights=(100 - (q * 100), q * 100), k=1)[0]
if success:
passengers += 1
要记住的第二件事,也许是最重要的,就是您将始终收到 0%,这是因为逻辑发展的方式,统计上几乎不可能没有人不出现,只有1个人不出现,在A情况下,不会有人超额预订
示例
我进行了一些测试,修改了一个人不会出现的概率百分比。
我想提一下,0.7
是一个 70%
的概率,并且在这种情况下非常高,这意味着在 100 人中,平均而言,每次模拟的结果都会出现在航班将是 30,这就是为什么从来没有超额预订的人。
除了 0.0%
,我得到的第一个结果是通过设置 q = 0.05
,结果我收到了 0.007
的超额预订概率(即 0.7%
) .
飞机B
我不会给你写模拟B公司案例的方案, 就是修改1行代码, 你最好写, 因为那是作业。但是我也对第二种情况做了一些测试,这里的情况在统计上变得更加有趣。
通过设置 q = 0.4
,我们收到的超额预订概率平均为 0.97
(97%
) 并且 q = 0.5
平均为 0.45
(45%
).