Джулия: распределение случайных полиномиальных чисел

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

pop = zeros(100)
p = rand(100)
p /= sum(p)

#imagine the next line inside a for loop
@time pop = rand(Multinomial(100, p)) #test1
@time pop .= rand(Multinomial(100, p)) #test2

Почему test1 — это 2 распределения, а test2 — 4? Есть ли способ сделать это с 0 распределениями?

Заранее спасибо.

За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
2
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Каждая выборка полиномиального распределения Multinomial(n, p) представляет собой n-мерный целочисленный вектор, сумма которого равна n. Итак, этот вектор расположен внутри rand.

Я полагаю, вы хотите использовать rand!, который работает на месте:

julia> m = Multinomial(100, p);

julia> @time rand!(m, pop);
  0.000010 seconds

Обратите внимание, что я сначала создаю объект m, так как его создание выделяет ресурсы, поэтому это нужно сделать один раз.

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