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

https://www.w3schools.com/python/ref_random_choices.asp

代码的主要问题是您试图将列表与布尔值进行比较,因为 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%).