Python偶数组分配

2024-05-13 20:33:51 发布

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

我是python的初学者,正在开发一个随机团队生成器。我遇到的问题是,我不知道如何让它产生均衡的团队。下面是代码以及示例输出。在

import random


def main():
    run = True
    while run:

        try:
            print("Welcome to this group picker, follow the instructions and your groups will be picked.")
            groupnum = int(input("How many groups do you want?"))
            peoplenum = int(input("How many people are there?"))
            print("Okay, assign everyone a number from 0 to", peoplenum - 1, ".")
            nums = []
            for i in range(0, peoplenum):
                nums.append(i)

            for i in nums:
                print("Number", i, "is in group", random.randint(1, groupnum))

            break

        except:
            print("Error, please follow instructions and enter only numbers.")
            break


main()

样本输出:

^{pr2}$

Tags: andtoruninmaingrouprandom团队
3条回答

只使用标准库,我会这样解决它:

import random
from itertools import accumulate


def print_groups(n, g):
    # Prepare group separators
    size = n // g
    rem = n % g
    separators = list(accumulate([0] + [size+1] * rem + [size] * (g - rem)))

    # Make raw data
    items = list(range(n))
    random.shuffle(items)

    # Iterate and print
    for i, s in enumerate(zip(separators, separators[1:])):
        group = items[slice(*s)]
        print(f'Group {i+1}: {group} (size {len(group)})')

如果您的人数可以除以您的组数,则所有组的大小将相同,否则第一个n % g组将获得一个额外的成员。在

例1:

^{pr2}$

例2:

print_groups(14, 4)

Group 1: [8, 3, 4, 6] (size 4)
Group 2: [1, 11, 0, 12] (size 4)
Group 3: [7, 5, 9] (size 3)
Group 4: [13, 10, 2] (size 3)

解决方案

import random


def main():
    run = True
    while run:

            print("\nWelcome to this group picker, follow the" \
                "instructions and your groups will be picked.\n")

            group_amount = int(input("How many groups do you want?\n"))
            people_amount = int(input("How many people are there?\n"))

            print("\nOkay, assign everyone a number from 1 to " +
                str(people_amount) + " .\n")

            group = list(range(0, group_amount))
            person = list(range(0, people_amount))
            group_size = people_amount / group_amount


            if group_size % 2 != 0:
                reg_group_size = (people_amount - 1) / group_amount
                odd_group_size = ((people_amount - 1) / group_amount) + 1

            for i in group[0:-1]:
               group[i] = reg_group_size

            group[-1] = odd_group_size

            for p in person:
                r = random.randint(0, len(group)-1)
                while group[r] == 0:
                    r = random.randint(0, len(group)-1) 
                person[p] = r + 1
                group[r] -= 1
                print("Person " + str(p + 1) + " is in group " + 
                    str(person[p]) + ".")

main()

输出

(xenial)vash@localhost:~/pcc/12/alien_invasion_2$ python3 helping.py

Welcome to this group picker, follow theinstructions and your groups will be picked.

How many groups do you want?
3
How many people are there?
10

Okay, assign everyone a number from 1 to 10 .

Person 1 is in group 3.
Person 2 is in group 1.
Person 3 is in group 2.
Person 4 is in group 2.
Person 5 is in group 1.
Person 6 is in group 3.
Person 7 is in group 2.
Person 8 is in group 1.
Person 9 is in group 3.
Person 10 is in group 3.

评论

我同意上面提到的所有解决方案,但我认为大多数解决方案都偏离了原来的代码。在

我试图保持代码的真实性,同时实现所需的缺失部分,以使其按预期运行,并保留原始输出。在

主要的问题是random.randint值不能说明一旦给一个人分配了一个组,random.randint值并不能解释每个组中空间的可用性。在

第一步:

^{pr2}$

这将创建一个列表groupperson,这是它们各自数量的大小。另外,让我们创建group_size,它将给出每个group中的person的数量。在

第二步:

        if group_size % 2 != 0:
            reg_group_size = (people_amount - 1) / group_amount
            odd_group_size = ((people_amount - 1) / group_amount) + 1

        for i in group[0:-1]:
           group[i] = reg_group_size

        group[-1] = odd_group_size

这里我们解决的问题是如果我们有group的大小不等。这将创建所有大小相等的group,最后一个group能够容纳剩余的person

第三步:

        for p in person:
            r = random.randint(0, len(group)-1)
            while group[r] == 0:
                r = random.randint(0, len(group)-1) 
            person[p] = r + 1
            group[r] -= 1
            print("Person " + str(p + 1) + " is in group " + 
                str(person[p]) + ".")

现在有趣的部分!这个循环将把person[p]分配给一个随机的group,然后将{}的数量大小减少1。在

让我们来分解一下:

        for p in person:
            r = random.randint(0, len(group)-1)
            while group[r] == 0:
                r = random.randint(0, len(group)-1)

我们将对我们分配的全部人口循环person。 然后我们选择一个随机的group来分配person,但是我们要确保group[r]有可用空间,while group[r] == 0:检查以确保有空间。如果没有,则生成一个新的r,直到我们找到一个有可用空间的随机group。在

            person[p] = r + 1
            group[r] -= 1
            print("Person " + str(p + 1) + " is in group " + 
                str(person[p]) + ".")

最后,我们分配person[p] = r + 1,这给了person[p]一个group编号(使用r + 1是为了消除“组0”,因为列表从0开始,而对于表示,我们希望从1开始)。之后,group[r]的值减少了1,说明空间可用性减少了。在print语句中,+ 1同样如此,我们没有把任何人称为“0个人”

希望这对你有帮助,我很喜欢做这个!在

问题是随机为每个球员挑选一支球队。由于^{}产生的值分布相等,因此每个玩家都有相同的机会被分配给任何给定的团队,因此您可以将每个人都放在同一个团队中。在

相反,你应该考虑迭代各个团队,并给它分配一个随机的玩家。在

如果这个想法实施得不好

>>> import random
>>> 
>>> groupnum = 2
>>> peoplenum = 8
>>> 
>>> people = [i for i in range(peoplenum)]
>>> 
>>> for i in range(peoplenum):
...     group = i % groupnum
...     person = random.choice(people)
...     people.remove(person)
...     print('Number {} assigned to {}'.format(person, group))
... 
Number 6 assigned to 0
Number 7 assigned to 1
Number 4 assigned to 0
Number 3 assigned to 1
Number 2 assigned to 0
Number 5 assigned to 1
Number 1 assigned to 0
Number 0 assigned to 1

它将解决问题,但它依赖于调用remove来避免重复团队成员。为了避免这种情况,你可以将玩家列表(使其随机)和^{}的结果与团队列表混合。在

^{pr2}$

这显然行不通。这是因为当最短的迭代器停止时,zip将停止,在我们的例子中groups。我们想要的是在有球员的情况下重演。我们可以用^{}实现这样的功能:

>>> import random
>>> import itertools
>>> 
>>> players = [i for i in range(peoplenum)]
>>> teams = itertools.cycle(range(groupnum))
>>> 
>>> random.shuffle(players)
>>> 
>>> [x for x in zip(players, teams)]
[(7, 0), (2, 1), (0, 0), (1, 1), (5, 0), (4, 1), (3, 0), (6, 1)]

相关问题 更多 >