Вычисление вероятности в python

#python #probability

#python #вероятность

Вопрос:

Моя проблема в том, что у меня 12 игроков, причем 3 из них называются A, B и C соответственно. 12 игроков делятся на 2 группы по 6 человек в каждой. Мне нужно рассчитать вероятность того, что игрок A и B будут в одной команде, а игрок C — в противоположной. Математика не является моей сильной стороной, потому что я уверен, что это не сложно вычислить, но я был бы очень признателен, если бы вы могли помочь мне с этим. Вот что я написал до сих пор:

 import random

playersnumb = 12
players = list(range(12))

A = random.choice([x for x in range(12)])

B = random.choice([x for x in range(12) if x != A])

C = random.choice([x for x in range(12) if (x != A) and (x != B)])

random.shuffle(players)
team1 = (players[:6])
team2 = (players[6:])

if A in team1:
    print("Player A is in team 1")
else:
    print("Player A is in team 2")
if B in team1:
    print("Player B is in team 1")
else:
    print("Player B is in team 2")
if C in team1:
    print("Player C is in team 1")
else:
    print("Player C is in team 2")
  

Любая помощь приветствуется.

Комментарии:

1. Это вопрос для mathoverfow: mathoverflow.net Вы просите помощи с математикой, а не с вашим кодом.

2. @kate-melnykova я спрашиваю, как решить проблему с помощью кода, очевидно.

Ответ №1:

Я написал немного на основе вашего кода. Идея состоит в том, чтобы многократно повторять ваш тестовый код, это не на 100% точно, но я думаю, что для вас достаточно хорошо:

 import random


def calculate(playercount: int = 12) -> bool:
    players = list(range(playercount))

    player_a = random.choice([x for x in range(playercount)])

    player_b = random.choice([x for x in range(playercount) if x != player_a])

    player_c = random.choice([x for x in range(playercount) if (x != player_a) and (x != player_b)])

    random.shuffle(players)
    team1 = (players[:playercount//2])
    team2 = (players[playercount//2:])

    # That are your "positive" events
    return (player_a in team1 and player_b in team1 and player_c in team2) or
           (player_a in team2 and player_b in team2 and player_c in team1)


def calculate_all(runtimes: int = 100000) -> float:
    counter = 0
    # count all poyitive events
    for i in range(runtimes):
        if calculate():
            counter  = 1

    # return how often they appeared, based on all tests
    return counter / runtimes


print("The probability is about {} %".format(calculate_all() * 100))
  

Ответ №2:

Количество способов заполнить 1 список из шести всего = 12!/(6! * 6!) comb(12,6)

Количество способов заполнить список из шести (включая A и B, а не C) = 9!/(4! * 5!) comb(9, 4)

Кроме того, хотите найти (не A, а не B и C) = 9!/ (5! * 4!) comb(9, 5)

 >>> from math import comb
>>> comb(12, 6)
924
>>> comb(9, 4)   comb(9, 5)
252
>>> 252 / 924
0.2727272727272727
  

Комментарии:

1. Я думаю, вам нужно удвоить это.

2. @Переполнение кучи Я отредактировал свой пост с доказательством моих результатов. Кажется, все хорошо, и проблем нет. (или я так думаю)

3. Попробуйте это .

4. @Переполнение кучи Я попробовал это, и если я запущу его с 1 строкой mean('A' in team1 and 'B' in team1 and 'C' not in team1 , а не со следующей строкой, результаты согласуются с моими результатами. Я думаю, что мы не пришли к единому мнению о том, какую проблему следует решить.

5. @Переполнение кучи Проблема, насколько я понимаю, заключается в следующем: A и B, а не C. Я думал, что именно это решил мой подход.