为了账号安全,请及时绑定邮箱和手机立即绑定

作用于python中的变量变化

作用于python中的变量变化

慕后森 2023-06-13 16:21:37
所以我正在尝试制作一个医院模拟(基于文本)并且可以选择招募更多员工。我已经想出如何限制他们可以招募的次数(限制 350 名员工)并且他们获得的数量应该是随机的(random.choice(staffrec),但是一旦从 staffrec 生成随机数,它就会保持不变相同,我希望代码再次运行并产生不同的结果。这是我的代码。(抱歉,我已经把所有的都放了,所以我不会错过任何东西)import timeimport randomstaff = 100wards = 20beds = 140patients = 80staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]staffrec = random.choice(staffrec)option = ""print("Welcome to Hospital Simulator!")print("You have to manage the hospital with patients coming in,")print("Staff recruitement and staff quitting,")print("and how many beds and wards are available!")Aopt = ["A", "a"]Bopt = ["B", "b"]Copt = ["C", "c"]Dopt = ["D", "d"]Eopt = ["E", "e"]Fopt = ["F", "f"]while staff <= 350:    staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]    staffrec = random.choice(staffrec)    staff = staff + staffrecwhile option != Fopt:    option = input("""What would you like to do:A: View number of patientsB: View number of bedsC: View number of wardsD: View number of staffE: Recruit more staffF: Quit\n""")    if option in Aopt:        print("You currently have " + str(patients) + " patients\n")    if option in Bopt:        print("You currently have " + str(beds) + " beds\n")    if option in Copt:        print("You have " + str(wards) + " wards\n")    if option in Dopt:        print("You currently have " + str(staff) + " staff\n")    if option in Eopt:        print("You try and recruit more staff. You recruit " + str(staffrec) + " staff\n")        if staff > 350:            print("You cannot recruit any more staff!")    if option in Fopt:        print("Goodbye!")        break还有其他与使用类的主题相关的帖子,但由于我是 python 的新手,所以我并不完全理解它们。:3 任何帮助将不胜感激!
查看完整描述

3 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

staffrec您在主要游戏逻辑之前分配值并且从不更新新的随机值,因此每次您进入添加新兵的循环块时它的值都是相同的。如果您希望它每次都更改,只需random在需要随机数时调用 only 即可。

我还建议使用randintover choice 方法,因为它会在任意两个值之间生成一个随机数。例如,random.randint(0, 100)将返回 0 到 100 之间的随机数。

见下文:

if option in Eopt:

    staffrec = random.randint(1, 9)

    staff = staffrec


    print("You try and recruit more staff. You recruit " + str(staffrec) + " staff\n")

    if staff > 350:

        print("You cannot recruit any more staff!")


查看完整回答
反对 回复 2023-06-13
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

据我了解,您想跟踪之前的选择,如果新选择与之前的选择相同,则应尝试再次选择,直到获得新值,这是我的看法:


prev_staffrec = None

staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]


def choose_staffrec():

    global prev_staffrec # to make sure you're accessing it in the global scope

    staffrec2 = random.choice(staffrec)

    if staffrec2 == prev_staffrec:

        choose_staffrec() # run the function again if it's the same

    return staffRec2

这消除了现在在任何有线路的地方一遍又一遍地创建 staffrec 的需要


staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]

staffrec = random.choice(staffrec)

你可以替换为:


choose_staffrec()


查看完整回答
反对 回复 2023-06-13
?
慕的地10843

TA贡献1785条经验 获得超8个赞

关于您的代码,有几件事对我来说很突出:

staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
staffrec = random.choice(staffrec)

这两行没有任何作用,因为staffrec无论如何您都要替换 later 的值。此外,根据经验,避免重复使用变量名,特别是如果您将它们重新分配给完全不同的类型(以前staffrec是列表,现在是整数)。

这个循环:

while staff <= 350:
    staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    staffrec = random.choice(staffrec)
    staff = staff + staffrec

看似多余,实际上并没有限制staff到最大350。使用这种方法,当循环结束时,staff将始终在351和359之间。你希望实际范围是多少?为什么你需要一个循环?只是用来random.randint生成一个固定范围内的数字。

这种情况:

while option != Fopt:

永远不会是假的。option永远是一个字符串,一个字符串永远不会等于一个元组。由于无论如何您break稍后都会使用来跳出循环,因此您不妨将其转换为while True:.

staff如果我正确理解了这个问题,您想知道如何为(通过重新运行之前的 while 循环)生成一个新值。您可以将它包装在一个函数中,但这似乎没有必要 - 只需使用它random.randint来生成一个新值,就像我之前提到的那样。


查看完整回答
反对 回复 2023-06-13
  • 3 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信