В пакетике лежат карточки с номерами 1, 2, 3, 4.
Если в ящике b 8 шаров, какова вероятность того, что в ящике окажется 2 черных шара?
import math
#흰공=0 검은공=1
box_b = list()
#조건부확률 = box_b 원소 개수 8개(=e)이면서 1이 2개(=f)일 확률 / e 확률
cnt_e = 0
cnt_ef = 0
for i in range(1, 5) :
if i == 1 :
box_b.append(0)
if i == 2 or i == 3 :
box_b.append([0, 1])
if i == 4 :
box_b.append([0, 0, 1])
for j in range(1, 5) :
if j == 1 :
box_b.append(0)
if j == 2 or j == 3 :
box_b.append([0, 1])
if j == 4 :
box_b.append([0, 0, 1])
for k in range(1, 5) :
if k == 1 :
box_b.append(0)
if k == 2 or k == 3 :
box_b.append([0, 1])
if k == 4 :
box_b.append([0, 0, 1])
for l in range(1, 5) :
if l == 1 :
box_b.append(0)
if l == 2 or l == 3 :
box_b.append([0, 1])
if l == 4 :
box_b.append([0, 0, 1])
print(box_b)
Вывод должен быть типа [0, [0,1], [0,0,1], [0,1]], [...]
, но на выходе [0, [0,1], 0, [0,1], 0, [0,1], 0, [0,1] .... (very long list)...] [..]
.
Что не так с моим кодом?
++ Это не дубликат: я пробовал i == 2 или i == 3 (разделение двух условий), но это не серьезная проблема, которую я ищу. Есть еще проблемы.
Я думаю, что раздел, в котором вы сравниваете, равно ли значение 2 или 3, ведет себя не так, как ожидалось. Оператор Python «или» работает как ИЛИ (значение слева, значение справа), поэтому, если вы пишете «i == 2 или 3», это на самом деле ИЛИ (i == 2, 3) и всегда будет возвращать true, поскольку значение справа больше 0 и считается истинным.
Вместо этого должно быть «i == 2 или i == 3» (что будет OR(i==2,i==3)). Та же идея для «k», «j» и «l».
Старый:
box_b = list()
for i in range(1, 5) :
if i == 1 :
box_b.append(0)
if i == 2 or 3 :
box_b.append([0, 1])
if i == 4 :
box_b.append([0, 0, 1])
print(i,box_b)
Новый:
box_b = list()
for i in range(1, 5) :
if i == 1 :
box_b.append(0)
if i == 2 or i == 3 :
box_b.append([0, 1])
if i == 4 :
box_b.append([0, 0, 1])
print(i,box_b)
Вот как будет выглядеть моделирование проблемы:
import random
random.seed(1)
def calc_prob(bag, sims):
def pick():
card = None
while card is None:
card = random.choice(bag)
if card is not None:
bag[card] = None
break
return card
eights = 0
blacks = 0
for _ in range(sims):
box_b = []
for _ in range(4):
card = pick()
if card == 1:
box_b.append(0)
elif card == 2 or card == 3:
box_b.extend([0, 1])
elif card == 4:
box_b.extend([0, 0, 1])
if len(box_b) == 8:
eights += 1
if box_b.count(1) == 2:
blacks += 1
return blacks / eights if eights else 0
sims = 100000
bag = [1, 2, 3, 4] * (sims + 1)
print(calc_prob(bag, sims))
0.08484606447865234
В вопросе говорится: «Вы должны класть карту обратно в карман каждый раз, когда вы ее вытаскиваете». Каждый раз, когда я выбираю карту, ее следует вернуть, а карт всегда 4.
@jinee Это означает, что каждый раз, когда выбирается одна карта, этой карты больше нет в мешке. Верно? Например, bag = [1, 1, 1, 1, 2, 2, 2, 2 , 3, 3, 3, 3, 4, 4, 4, 4]
, мы выбираем 4. Тогда сумка изменится на: bag = [1, 1, 1, 1, 2, 2, 2, 2 , 3, 3, 3, 3, 4, 4, 4]
. Его размер уменьшается с 16 до 15.
Хорошо замечено. Но у меня все еще есть проблема. Во-первых, почему мы делаем это 100000 раз? (симс) Я немного изучаю питон, поэтому не могу этого понять, несмотря на ваше любезное объяснение. Во-вторых, восьмерок должно быть 70, а черных — 6. Я попробовал print(eights,blacks) в вашем коде, но этого значения нет.
@ginee 100000
время не обязательно. Просто для усреднения вероятности. Вы можете задать вопрос здесь, чтобы лучше понять основы.
Спасибо за ответ. Я следую вашему ответу, но проблема все еще оставалась. Мой учитель сказал, что box_b должен сбрасываться при изменении i, j, k, l. Но мы с ним не знаем, в какую строку должна перейти точка сброса.