Дискретная математика: смоделируйте вопрос о вероятности

Проблема

В пакетике лежат карточки с номерами 1, 2, 3, 4.

  • Если вы возьмете 1, добавьте один белый шар в box_b.
  • Если вы возьмете 2 или 3 шара, добавьте в коробку_b один белый и один черный шар.
  • Если вы взяли 4, добавьте в коробку_b два белых и один черный шар.
  • Вы должны положить карту обратно в карман каждый раз, когда вы ее достаете.
  • Вам придется сделать это 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)...] [..].

Что не так с моим кодом?

  • Мой учитель сказал, что box_b должен сбрасываться при изменении i, j, k, l. Из-за этого результат накопился. Но мы с ним не знаем, в какую строку должна перейти точка сброса.

++ Это не дубликат: я пробовал i == 2 или i == 3 (разделение двух условий), но это не серьезная проблема, которую я ищу. Есть еще проблемы.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что раздел, в котором вы сравниваете, равно ли значение 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)

Спасибо за ответ. Я следую вашему ответу, но проблема все еще оставалась. Мой учитель сказал, что box_b должен сбрасываться при изменении i, j, k, l. Но мы с ним не знаем, в какую строку должна перейти точка сброса.

jinee 05.07.2024 05:21
Ответ принят как подходящий

Вот как будет выглядеть моделирование проблемы:

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 05.07.2024 05:11

@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.

user24714692 05.07.2024 05:25

Хорошо замечено. Но у меня все еще есть проблема. Во-первых, почему мы делаем это 100000 раз? (симс) Я немного изучаю питон, поэтому не могу этого понять, несмотря на ваше любезное объяснение. Во-вторых, восьмерок должно быть 70, а черных — 6. Я попробовал print(eights,blacks) в вашем коде, но этого значения нет.

jinee 05.07.2024 08:40

@ginee 100000 время не обязательно. Просто для усреднения вероятности. Вы можете задать вопрос здесь, чтобы лучше понять основы.

user24714692 05.07.2024 17:27

Другие вопросы по теме