while 循环不会永远 work/loops |初学者问题

While loop doesn't work/loops forever | Beginner question

以下是我对这个问题的尝试解决方案: 彩票中的头等奖是通过将 1 到 30 之间的三个数字与按相同顺序抽取的三个随机数相匹配而获得的。当一个球被抽出时,它会在抽出另一个球之前被放回机器中。在抽取一个球之前,机器中总是有 30 个球,玩家可以多次选择同一个球。每周抽奖一次。编写一个函数,以三个数字为参数,抽取三个介于 1 和 30 之间的随机数和 returns 赢得大奖所需的周数。 (例如,选择的号码:17、12、25 必须匹配:球一是 17,球二是 12,球三是 25。)

我的尝试:

import random

chosen = []
for i in range(0, 3, 1):
  chosen.append(input("Please input your lucky number: "))

drawn_numbers = []
count = 0
week_count = 0

print("Your chosen numbers are: {}, {}, {}".format(chosen[0], chosen[1], chosen[2]))

while count != 3:
  for i in range(0, 3, 1):
    random_number = random.randint(1, 30)
    drawn_numbers.append(random_number)
  
  for i in range(0, 3, 1):
    if drawn_numbers[i] in chosen:
      count += 1
    
  week_count += 1
  drawn_numbers = []

print("It took you {} weeks to win.".format(week_count))

出于某种原因,while 循环忽略了 count += 1 部分并永远循环随机生成的 drawn_numbers 列表。

显然我的循环有问题,但我看不到它 D:

关于如何使该循环工作的一些建议会很好。谢谢

您是否检查过您的 if 语句是否变为真?

一个想法是,选择的可能包括字符串值作为数字。试试 运行:

print(type(chosen[0]))

这应该是一个整数。通过以下方式修复:

chosen.append(int(input("Please input your lucky number: ")))

首先 - 欢迎来到 Python 的世界!

你有几个错误:

  • input function returns a string and not an int。意思是,您尝试在 if drawn_numbers[i] in chosen 中隐式进行的比较 永远不会 为真,因此 count 始终为 0 并且您陷入了无限循环。

  • 假设您已修复上述错误,您仍然有机会 count 在循环评估时永远不会达到 3。考虑以下情况:

    1. 用户输入数字 [1, 2, 3]
    2. drawn_numbers[1, 2, 4]
    3. 因此,count 现在将是 2
    4. while条件是count != 3True因此循环继续。
    5. 再次抽取的号码是[1, 2, 4]
    6. count现在是4
    7. 以后count只会增加,永远不会等于3

    你知道这是怎么回事吗?尝试在循环开始时(内部)重置 count

  • a lottery is won by matching three numbers ... in the same order

    但是您实施的比较仅在列表中查找 存在,而不是逐个元素进行比较。


因此,一个有效的(不是以最 Pythonic 方式编写的)版本将是:

import random

chosen = []
for i in range(0, 3, 1):
    chosen.append(int(input("Please input your lucky number: ")))  # notice the int cast

drawn_numbers = []
count = 0
week_count = 0

print("Your chosen numbers are: {}, {}, {}".format(chosen[0], chosen[1], chosen[2]))

while count != 3:
    count = 0  # notice that count is reset here 
    
    for i in range(0, 3, 1):
        random_number = random.randint(1, 30)
        drawn_numbers.append(random_number)
    
    for i in range(0, 3, 1):
        if drawn_numbers[i] == chosen[i]:  # notice that we compare the elements in the same location
            count += 1

    week_count += 1
    drawn_numbers = []

print("It took you {} weeks to win.".format(week_count))


如果您有兴趣,这里有一个更 Pythonic 的方式:

import random

chosen = [int(input("Please input your lucky number: ")) for _ in range(3)]
print(f'Your chosen numbers are: {chosen}')

matched = False
week_count = 0

while not matched:
    drawn_numbers = [random.randint(1, 30) for _ in range(3)]    
    matched = drawn_numbers == chosen
    week_count += 1

print(f"It took you {week_count} weeks to win.")

您可能会在其中发现一些对您来说可能是新的功能,但我强烈建议您掌握它们:

  1. List comprehension
  2. range(3) 等同于 range(0, 3, 1)
  3. Formatting string literals
  4. == 运算符实际上是逐个元素地比较两个列表!

有趣的旁注:运行 这个没有顺序限制的代码导致等待赢得彩票的时间大大减少了 :)