#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. Я думал, что именно это решил мой подход.