Превратить цикл генерации случайных чисел в одно уравнение?

Вот некоторый псевдокод:

count = 0
for every item in a list
    1/20 chance to add one to count

Это более или менее мой текущий код, но в этом списке могут быть сотни тысяч элементов; поэтому он быстро становится неэффективным. (разве это не называется 0(n) или как-то так?)

Есть ли способ сжать это в одно уравнение?


person Mackenzie McClane    schedule 12.09.2015    source источник
comment
Разве это не означает, что count является случайной величиной со средним значением = list.length/20 и стандартным отклонением = sqrt (19/20/20)/sqrt (list.length), если list.length велик?   -  person FJDU    schedule 13.09.2015
comment
среднее, да, но я ничего не знаю о стандартном отклонении и прочем. Я перестал заниматься математикой в ​​тот год, когда должен был выучить подобные вещи. знак равно   -  person Mackenzie McClane    schedule 13.09.2015
comment
Количество строк кода для читаемого ответа зависит от языка. Кроме того, в этом отношении строки кода обычно не являются полезным показателем производительности.   -  person President James K. Polk    schedule 13.09.2015
comment
Ну, это было не совсем то. Я просто хотел, чтобы не было петли, в основном. Я изменил формулировку.   -  person Mackenzie McClane    schedule 13.09.2015


Ответы (2)


Давайте посмотрим на свойства описанной вами случайной величины. Цитата из Википедии:

Биномиальное распределение с параметрами n и p — это дискретное распределение вероятностей числа успехов в последовательности из n независимых экспериментов «да/нет», каждый из которых дает успех с вероятностью p.

Пусть N будет количеством элементов в списке, а C будет случайной величиной, представляющей count, которую вы получаете из своего псевдокода. C будет следовать биномиальному распределению вероятностей (как показано на изображении ниже) с p = 1/20:

введите здесь описание изображения

Оставшаяся проблема заключается в том, как эффективно опросить случайную величину с указанным распределением вероятностей. Существует ряд библиотек, которые позволяют вам делать выборки из случайных величин с заданным PDF. Мне никогда не приходилось реализовывать это самому, поэтому я точно не знаю деталей, но многие из них имеют открытый исходный код, и вы можете сами ознакомиться с реализацией.

Вот как можно рассчитать count с помощью библиотеки numpy в Python:

n, p = 10, 0.05                  # 10 trials, probability of success is 0.05
count = np.random.binomial(n, p) # draw a single sample
person Asad Saeeduddin    schedule 12.09.2015

По-видимому, ОП просил более эффективный способ генерации случайных чисел с тем же распределением, которое это даст. Хотя вопрос заключался в том, как выполнить ту же операцию, что и в цикле, но в виде одного вкладыша (и желательно без временного списка, который существует только для повторения).


Если вы сэмплируете генератор случайных чисел n раз, в лучшем случае он будет иметь время выполнения O (n), независимо от того, как выглядит код.

В некоторых интерпретируемых языках использование более компактного синтаксиса может заметно повлиять на постоянные факторы времени выполнения. Другие факторы могут повлиять на время выполнения, например, будете ли вы сохранять все случайные значения и затем их обрабатывать или обрабатывать на лету без временного хранения.

Ничто из этого не позволит вам избежать линейного увеличения времени выполнения с n.

person Peter Cordes    schedule 12.09.2015
comment
ОП хочет сжать [приведенный выше код]... в одно уравнение, так что это в основном не имеет значения. - person Asad Saeeduddin; 13.09.2015
comment
@Asad: Он говорит [список может быть большим], поэтому он быстро становится неэффективным. IDK, если он думает, что если сделать его однострочным, это сделает его O (1), или если он просто имеет в виду, что он избежит фактической инициализации временного списка, уменьшив постоянный коэффициент в его O (1). В его последнем комментарии к вопросу говорится, что я просто хотел, чтобы не было цикла, поэтому я думаю, что этот ответ очень важен для непонимания ОП того, что медленно, а что быстро. - person Peter Cordes; 13.09.2015
comment
Я думаю, что под однострочником ОП подразумевает выражение в закрытой форме, то есть такое, которое дает результат арифметических манипуляций с одним числом PRG. Это не включает в себя итерацию по списку значений, поэтому это O (1). Хотя я не думаю, что это на самом деле возможно, безусловно, можно улучшить производительность O (n) наивной реализации. - person Asad Saeeduddin; 13.09.2015
comment
@Asad: ааа, я думаю, ты прав. Это также гораздо лучший / более интересный вопрос. Я думаю, именно поэтому она (?) приняла ваш ответ. :) Формулировка вопроса на самом деле не спрашивала, как сгенерировать случайное число из того же распределения, но была написана больше с точки зрения выражения той же самой операции в виде одного вкладыша... - person Peter Cordes; 13.09.2015
comment
Да, извини за это, Питер. Я довольно неопытен в использовании уравнений/сложных математических вещей и т. д., поэтому я не знаю, как сформулировать то, что я прошу, слишком хорошо. - person Mackenzie McClane; 13.09.2015
comment
@MackenzieMcClane: вам не нужно использовать технический язык. Вы могли бы спросить: как я могу эффективно получать случайные числа, подобные тем, которые я получаю из «моего кода»? Моя реализация должна вызывать RNG N раз в цикле, чтобы получить ответ, что медленно для больших N. И если вы чувствуете информатику, вы можете сказать, что Моя реализация - O (N). Есть ли более быстрый способ, предпочтительно O (1)? Тогда люди, знакомые с такими вещами, смогут быстро понять, что вам нужна простая формула для превращения одного или двух выходов ГСЧ в то, что вы хотите, независимо от N. - person Peter Cordes; 13.09.2015
comment
В любом случае, надеюсь, что это поможет вам в будущем задавать вопросы. :) Невозможно придумать все способы, которыми кто-то может неверно истолковать то, как вы формулируете вопрос, особенно. если (как это часто бывает по понятным причинам) вы спрашиваете о чем-то, о чем вы еще не знаете. Но, по крайней мере, попробуйте и, возможно, включите краткое изложение вопроса, если вы чувствуете, что должны сказать кучу других справочных материалов, которые могут заставить читателей подумать, что вы интересуетесь чем-то другим. - person Peter Cordes; 13.09.2015