найти целое число элементов из списка с заданной вероятностью

Предположим, у меня есть список длиной 20, и каждый день я хочу узнать целое число элементов из этого списка с определенной вероятностью. После извлечения целого числа элементов я хочу выполнить дальнейшие операции.

m = [10,20,30,40, 50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200]
prob = 0.2

В приведенном выше примере я хочу выяснить, сколько элементов будет выбираться в среднем каждый день с вероятностью 0,2. Таким образом, в среднем из списка длиной 20 и вероятностью 0,2 я должен получать количество элементов = 4 каждый день. Как я могу получить количество событий с учетом вероятности в Python? Должен ли я использовать Пуассона для получения количества событий за период времени, но я не уверен, как включить размер списка в функцию Пуассона в Python. И как получить целое число элементов, когда вероятность равна, скажем, 0,113 или 0,31 и т. д. Как я могу получить это в Python?


person HT121    schedule 15.08.2019    source источник
comment
prob * len(m)? Вы, кажется, слишком усложняете это.   -  person John Coleman    schedule 15.08.2019
comment
Есть ли связь между вероятностью и количеством выбранных предметов?? Я не верю, что есть?   -  person Anwarvic    schedule 15.08.2019
comment
Должно ли это быть int(prob * len(m)), как говорит Джон Коулман?   -  person ivallesp    schedule 15.08.2019


Ответы (2)


Предполагая, что выбор каждого элемента списка является независимым событием с вероятностью prob, количество выбранных элементов является биномиальной случайной величиной с параметрами len(m) и prob. Ожидаемое значение такой случайной величины равно prob * len(m).

Если вы хотите имитировать эту случайную переменную (а не вычислять ее ожидаемое значение), вы можете использовать:

import random

def binomial_variate(n,p):
    return sum(random.random() < p for _ in range(n))

Например,

>>> trials = [binomial_variate(20,0.12) for _ in range(100)]
>>> trials
[5, 6, 2, 1, 2, 4, 3, 3, 2, 3, 4, 1, 3, 2, 2, 3, 1, 0, 2, 4, 6, 1, 1, 2, 2, 3, 4, 2, 2, 1, 2, 1, 3, 4, 2, 3, 2, 2, 4, 4, 5, 1, 1, 1, 1, 2, 2, 3, 2, 2, 5, 4, 4, 1, 4, 4, 3, 5, 2, 3, 2, 4, 3, 4, 4, 2, 2, 1, 2, 1, 2, 1, 3, 0, 4, 3, 2, 4, 1, 2, 1, 2, 3, 2, 2, 3, 2, 1, 4, 4, 2, 2, 2, 2, 2, 3, 3, 3, 4, 2]
>>> sum(trials)/100
2.55
>>> 20*0.12
2.4
person John Coleman    schedule 15.08.2019
comment
Prob * len(m) отлично работает, когда вы получаете целое число из этого умножения, но когда вы получаете десятичное число, вам нужно округлить, используя int(len(m) * prob). Предполагая фиксированную длину списка 20 и prob = 0,113, вы получаете 2,26, а с int() вы получаете 2. Это вызовет большую разницу в общем количестве после рисования количества элементов 1000 раз (2 * 1000 против 2,26). *1000). Есть ли другой способ получить целое число элементов прямо из расчета вероятности без использования int(), аналогично распределению Пуассона, где оно возвращает целое число событий за период времени)? - person HT121; 15.08.2019
comment
@HT121 Ожидаемое число равно prob * len(m). Я не понимаю, почему вы хотите округлить математически значимый ответ до чего-то, что не имеет такого большого смысла. Если это не ожидаемое число, которое вы пытаетесь вычислить, что вы пытаетесь сделать? Обратите внимание, что при запуске эксперимента фактическое выбранное число будет целым числом, но будет меняться от испытания к испытанию. Когда вы усредняете множество таких испытаний, результат не обязательно должен быть целым числом. - person John Coleman; 15.08.2019
comment
На самом деле мне нужно выяснить, сколько агентов будет перемещаться в новое место каждые 24 часа. Таким образом, эти номера агентов могут быть только целыми числами. Я мог бы выбрать случайных агентов с заданной вероятностью и переместить их, но проблема в том, что мне нужно сначала посмотреть, есть ли в новом месте свободное место для размещения нового агента. Поэтому я хотел сначала извлечь количество агентов, которые будут перемещены в течение следующих 24 часов, а затем каждый раз, который очень мал, я продолжаю искать, есть ли свободное место в следующем месте. когда это возможно, я случайным образом выбираю агента, перемещаю его и вычитаю 1 из переменной count. - person HT121; 15.08.2019
comment
но все равно спасибо, ваш ответ совершенно правильный для общего случая. - person HT121; 15.08.2019
comment
@HT121 HT121 Я добавил информацию о том, как имитировать случайную переменную (в модуле Python random нет прямого способа генерировать такие случайные переменные, поэтому вам нужно написать свою собственную функцию (или использовать другой модуль)). - person John Coleman; 15.08.2019
comment
Ваши последние правки гораздо ближе к тому, что я хочу. Спасибо. - person HT121; 15.08.2019

Вы можете просто использовать что-то вроде int(len(m) * prob) в своем коде на Python, и это сработает. Чтобы избежать ошибок, не забудьте окружить их с помощью try/catch.
Вам также следует убедиться, что значение prob состоит из значений от 0 до 1 включительно.

person cocool97    schedule 15.08.2019