【问题标题】:Python random.choice stuck in loop [duplicate]Python random.choice陷入循环[重复]
【发布时间】:2021-07-06 11:01:10
【问题描述】:

我是一个完全的业余爱好者,并且知道可能有更简单的方法可以做到这一点,但这不是一个重要的项目,只是一个超级快速的代码。由于某种原因,它似乎陷入了循环,因为 random.choice 一遍又一遍地给出相同的数字。它有时会起作用,我只需要尝试几次,随着范围的增加,难度就越大。

代码应该为每一轮的每个“玩家”分配一个唯一的号码,而不是两次给同一个玩家相同的号码。

import random

A = []
B = []
C = []
D = []
E = []
F = []
G = []
H = []
I = []
J = []
K = []
lt = [A, B, C, D, E, F, G, H, I, J, K]
lit = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
ALT = 0
for e in range(5):
    lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    for i in lt:
        while True:
            add = random.choice(lst)
            if add not in i:
                i.append(add)
                lst.remove(add)
                break
            else:
                print('fant ingenting')
    ALT += 1
    print(ALT)

tot = 0
for k in lt:
    print(str(lit[tot]) + ' = ' + str(k))
    tot += 1

【问题讨论】:

  • 如何改变逻辑,这样你就有一个循环的外循环和一个内循环的玩家来分配该回合的数字。对于每个玩家,您列出之前未分配给该玩家或在本轮中使用的所有号码,然后从该玩家在本轮中列出的随机选项中分配一个。

标签: python list loops random


【解决方案1】:

因此,您有一个包含 11 个玩家的列表,并且您想为他们分配 11 个唯一 ID(从 1 到 11)。为什么不只是 shuffle() 一次 ID 列表并完成它?

lit = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
random.shuffle(lst)

for player, player_id in zip(lit, lst):
    print("player", player, "has id", player_id)

如果您想多次提供随机 ID 而不重复,一个非常简单的方法就是旋转它们:

lit = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
random.shuffle(lst)

for round in range(5):
    print("Round", round)

    for player, player_id in zip(lit, lst):
        print("> player", player, "has id", player_id)

    lst = lst[1:] + lst[:1]

请注意,使用lst = lst[1:] + lst[:1] 进行轮换的最后一步对于小列表来说是可以的,但对于大列表来说可能效率很低,因为它每次都会创建整个列表的新副本。如果您正在处理更大的列表,您可以使用deque

lit = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
random.shuffle(lst)

lst = deque(lst)

for round in range(5):
    print("Round", round)

    for player, player_id in zip(lit, lst):
        print("> player", player, "has id", player_id)

    lst.rotate(1)

此解决方案的一个警告是,由于玩家是按顺序排列的,因此 ID 将按顺序在每一轮中分配。因此,例如,您已经知道,如果玩家 A, B, C 的 ID 最初是 1, 2, 3,那么玩家 C 将在接下来的两轮中获得 ID 21。为了避免这种情况并获得更多不可预测的 ID,您还可以先对玩家列表进行洗牌:

random.shuffle(lit)
random.shuffle(lst)

# ... same code as above ...

这样你就没有可预测的“下一个玩家”来获得特定的 ID。

【讨论】:

  • 是的,如果我只需要一轮会更容易,但是除了玩家每轮获得一个唯一的 ID 之外,他们只能获得一次相同的 ID。例如,一支足球队进行了 4 场比赛,其中每个球员在比赛之间轮换,并且不会两次在同一个位置上踢。
  • @kriwet 对此感到抱歉,我没有注意到。检查我更新的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2010-11-09
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
相关资源
最近更新 更多