Здравствуйте, Аноним, Вы писали:
А>? генерит случайный вектор. А как создать вектор случайных целых, так чтобы каждому из возможных значений соответствовала своя верояность попадания?
Такого рода задачи решаются через равномерное распределение, к которому потом применяется функция.
В данном случае, можно сгенерировать вектор случайных чисел от 0 до p1+p2+...+pN=1 и маппинг типа (p1 -> N1;p1+p2 -> N2;...;p1+..+pN -> NN) и с помощью этого маппинга сгенерировать из равномерного вектора неравномерный.
Не знаю как в J, а в Q можно так:
p:(0.1;0.2;0.05;0.3;0.25;0.1)
q:(1; 2; 3; 4; 5; 6)
v:10?1.
q (+\[p]>/:v)?'1b / по вектору с накапливающейся суммой вероятностей найти место, где каждое случайное число становится
/ больше текущей суммы, потом найти позицию этой 1 (true) и по ней определить в векторе q нужное значение.
Не супер эффективно, правда. Может есть подход побыстрее.
Здравствуйте, Аноним, Вы писали: А>? генерит случайный вектор. А как создать вектор случайных целых, так чтобы каждому из возможных значений соответствовала своя верояность попадания?
Самый простой способ — метод инверсии. Надо на равномерно распределенный от 0 до 1 случайный вектор замаппить функцию, обратную желаемой функции распределения.
Re[2]: [j]генерация случайных целых
От:
Аноним
Дата:
15.04.08 11:38
Оценка:
Здравствуйте, Quintanar, Вы писали:
Q>Не знаю как в J, а в Q можно так: Q>
Q>p:(0.1;0.2;0.05;0.3;0.25;0.1)
Q>q:(1; 2; 3; 4; 5; 6)
Q>v:10?1.
Q>q (+\[p]>/:v)?'1b / по вектору с накапливающейся суммой вероятностей найти место, где каждое случайное число становится
Q> / больше текущей суммы, потом найти позицию этой 1 (true) и по ней определить в векторе q нужное значение.
Q>
На J тот же алгоритм можно записать так:
v =: 2 : '({&u @ i.&1 @: ((+/\v)&>:))"0' NB. conjunction которая будет производить глагол преобразующий вероятность в число (u - список чисел v - список вероятностей)
ud =: (?@$&0) NB. глагол производящий вектор равномерно распределенных чисел [0;1] (аргумент - длина вектора)
Далее пример использования (данные слямзены у Quintanar)
q =: 1 2 3 4 5 6
p =: 0.1 0.2 0.05 0.3 0.25 0.1
f =: q v p NB. Искомый глагол (аргумент - случайная величина [0;1])
fn =: f@ud NB. Это будет производить последовательность заданной длины
единственное, что — подскажите как получить вектор x, используя глагол g.
решение p ($~"0 [: g ]) q приводит к заполнению нулями недостающих частей вектора..
Здравствуйте, Аноним, Вы писали:
А>а вот другой способ, который работает на порядок быстрей: А> ... А>единственное, что — подскажите как получить вектор x, используя глагол g. А>решение p ($~"0 [: g ]) q приводит к заполнению нулями недостающих частей вектора..
Вот один из вариантов
gen =: (#/@[ , ])/ &. (, & 0 0) @ ,.
NB. слева - количество элементов, справа - сами элементы
NB. использование: (g p) gen q
NB. Тест:
3 2 1 gen 1 2 3
1 1 1 2 2 3