Python random.choice卡在循环中

Python random.choice卡在循环中,python,list,loops,random,Python,List,Loops,Random,我是一个完全的业余爱好者,知道可能有更简单的方法来做这件事,但这不是一个重要的项目,只是一个超快速的代码。由于某种原因,它似乎陷入了一个循环,因为random.choice一次又一次地给出相同的数字。它有时是有效的,我只需要试几次,随着距离的增加,难度就越大 代码应该在每一轮为每个“玩家”分配一个唯一的数字,而不给同一玩家相同的数字两次 import random A = [] B = [] C = [] D = [] E = [] F = [] G = [] H = [] I = [] J

我是一个完全的业余爱好者,知道可能有更简单的方法来做这件事,但这不是一个重要的项目,只是一个超快速的代码。由于某种原因,它似乎陷入了一个循环,因为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

所以你有一个11个玩家的列表,你想给他们分配11个唯一的ID(从1到11)。为什么不只列出一次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]
随机。洗牌(lst)
对于玩家,拉链中的玩家id(lit,lst):
打印(“玩家”,玩家,“有id”,玩家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]
随机。洗牌(lst)
对于范围内的圆形(5):
打印(“圆形”,圆形)
对于玩家,拉链中的玩家id(lit,lst):
打印(“>player”,player,“has id”,player\u 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
2
1
。为了避免这种情况并获得更多不可预测的ID,您还可以先洗牌玩家列表:

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

# ... same code as above ...

这样,您就不会有一个可预测的“下一个玩家”来获取特定的ID。

因此,您有一个包含11个玩家的列表,您希望为他们分配11个唯一的ID(从1到11)。为什么不只列出一次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]
随机。洗牌(lst)
对于玩家,拉链中的玩家id(lit,lst):
打印(“玩家”,玩家,“有id”,玩家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]
随机。洗牌(lst)
对于范围内的圆形(5):
打印(“圆形”,圆形)
对于玩家,拉链中的玩家id(lit,lst):
打印(“>player”,player,“has id”,player\u 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
2
1
。为了避免这种情况并获得更多不可预测的ID,您还可以先洗牌玩家列表:

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

# ... same code as above ...

这样,您就不会有一个可预测的“下一个玩家”来获得特定的ID。

如何更改逻辑,这样您就可以在回合上有一个外循环,在玩家上有一个内循环来分配该回合的号码。对于每个玩家,你列出一个以前没有分配给这个玩家或在这一轮中使用过的所有数字的列表,然后从这个玩家在这一轮中列出的数字中随机分配一个选项。改变逻辑如何,这样你就有了一个外循环和一个内循环来分配那一轮的数字。对于每个玩家,你列出所有之前没有分配给该玩家或在本轮中使用过的数字,然后从该玩家在本轮中列出的数字中随机选择一个。是的,如果我只需要一轮,这会更容易,但除了玩家每轮获得唯一ID外,他们只能获得一次相同的ID。例如,一支足球队打4场比赛,每名球员在两场比赛之间轮换,不打同一个位置两次。@kriwet很抱歉,我没有注意到。检查我的更新答案。是的,如果我只需要一轮,这会更容易,但除了玩家每轮都获得一个唯一的ID外,他们只能获得一次相同的ID。例如,一支足球队打4场比赛,每名球员在两场比赛之间轮换,不打同一个位置两次。@kriwet很抱歉,我没有注意到。检查我的最新答案。