Вероятность получения более чем порога одного цвета за определенное количество розыгрышей (без замены только в случае успеха) - PullRequest
0 голосов
/ 16 октября 2019

ВОПРОС: Предположим, что мы случайным образом рисуем из коробки 50 цветных шаров (например, 10 красных, 40 синих). Если выбранный шар красного цвета, он не заменяется на коробку. В противном случае синий шар заменяется обратно в коробку, поэтому 40 синих является постоянным в ячейке, а красный уменьшается со временем, что влияет на вероятность. Какова вероятность получения более 9 красных шаров за 50 розыгрышей?

ЧТО Я ПРОБОВАЛ: Прошу прощения за свои навыки в гетто-питоне, я написал код, в котором каждый розыгрыш дает 2 результата, красный или синий. ,Поэтому после 50 розыгрышей я вычисляю все комбинации и соответствующие вероятности и добавляю все вероятности комбинаций с более чем 9 красными шарами.

ПРОБЛЕМА: Код работает, если я ставлю, скажем, 10 ничьих. Но если я поставлю 50 дро, то нужно будет вычислить 2 ^ 50 комбинаций, и это займет слишком много времени. Есть ли способ кодировать это более эффективно?

def drawred(redlist,bluelist):
    if len(redlist) == 0:
        newredlist = []
        redprob = red/float(red+blue)
        newred = red - 1
        newredlist.append(['R', redprob, newred])
    else:
        newredlist = []
        for i in redlist:
            redprob = i[1]*i[2]/float(i[2]+blue)
            newred = i[2] - 1
            newredlist.append([i[0] + 'R', redprob, newred])
        for i in bluelist:
            redprob = i[1]*i[2]/float(i[2]+blue)
            newred = i[2] - 1
            newredlist.append([i[0] + 'R', redprob, newred])
    return newredlist

def drawblue(redlist,bluelist):
    if len(bluelist) == 0:
        newbluelist = []
        blueprob = blue/float(red+blue)
        newred = red
        newbluelist.append(['B', blueprob, newred])
    else:
        newbluelist = []
        for i in redlist:
            blueprob = i[1]*blue/float(i[2]+blue)
            newred = i[2]
            newbluelist.append([i[0] + 'B', blueprob, newred])
        for i in bluelist:
            blueprob = i[1]*blue/float(i[2]+blue)
            newred = i[2]
            newbluelist.append([i[0] + 'B', blueprob, newred])
    return newbluelist

draws = 50
draw_current = 1
red = 10
blue = 40
redlist = []
bluelist = []

while draw_current <= draws:
    redlist = drawred(redlist,bluelist)
    bluelist = drawblue(redlist,bluelist)
    draw_current += 1

finallist = redlist + bluelist
probability = 0
for i in finallist:
    if i[0].count('R') >= 9:
        probability += i[1]

print probability*100
...