Python:为什么值总是返回0

2024-05-13 09:28:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,我正在努力为学校解决这个问题

航空公司发现,每个预订座位的乘客都无法独立于其他乘客以概率q出现。所以A航空公司总是为他们的n个航班出售n张机票−一个座位的飞机,而航空公司B总是为他们的n销售2n张机票− 2座飞机。哪一个更经常被超额预订

这是我的代码:

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。我不太明白我做错了什么


Tags: truecounterrandomsimreserved机票航空公司seats
3条回答

代码的主要问题是,您试图将列表与布尔值进行比较,因为random.choice()函数返回一个列表

因此,首先您必须获取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%的回报,这是因为逻辑发展的方式,统计上几乎不可能没有人不出现,只有一个人不出现,在案例a中,在超售中不会有人


示例

我做了一些测试,修改了一个人不出现的概率百分比

我想提到的是{}是一种{}概率,在这种情况下非常高,这意味着在100人中,每次模拟的平均结果是30人,这就是为什么从来没有超额预订的人

除了0.0%之外,我得到的第一个结果是设置q = 0.05,因此我收到了0.007的超售概率(即0.7%


平面B

我不会给你写模拟B公司案例的解决方案,它是修改一行代码,你最好这样做,因为这是一个任务。然而,我也为第二个案例做了一些测试,这里的情况在统计学上变得更加有趣

通过设置一个q = 0.4,我们得到的平均超售概率为0.9797%),平均超售概率为q = 0.50.45

代码的问题是这一行: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()的说明,请访问以下链接

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

random.choices()正在返回一个列表,因此它永远不会像返回success == ['True']那样返回success == True。尝试修复以下问题:

success = random.choices(arrive, weights=(100 - (q * 100), q * 100), k=1)[0]

其次,你可能需要稍微调整一下你的功能。您的最大座位数为100…然后在100个座位中选择.30真、.70假。要超额预订,您需要所有的Pasanger返回为True(这样您将有乘客>;n-1(即100名乘客>;99名乘客)

你必须把你的q改为一个很小的概率(即,一个乘客确实表现出的高概率,这样你就可以得到所有100人都出现的情况)

这样想吧,如果你把一枚硬币掷100次,你需要100个硬币的正面大于100-1。如果硬币的重量是0.30个正面和0.70个反面……理论上这是可能发生的(你可以计算出概率),你将“永远不会”实验/模拟得到100个头部。你需要一个重量为.999个头部和.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

你可以通过数学方法来解决这个问题,而不是通过模拟

相关问题 更多 >