2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2
 
 Re: генератор случайных чисел
Сообщение11.10.2011, 11:36 
AndreyL в сообщении #491334 писал(а):
Друзья!
Понадобился генератор случайного вектора размерности $n$. Каждая $i$-я компонента вектора $y(i)$ подчиняется равномерному распределению в диапазоне от $LB(i)$ до $UB(i)$, а сумма всех компонент должна быть равна $A$: $\sum _{i=1}^n y(i)=A$. Как это можно реализовать?


у iostream есть встроенные ф-ии забивки векторов, насколько я знаю

 
 
 
 Re: генератор случайных чисел
Сообщение11.10.2011, 12:14 
Пока реализовал самый простой вариант: генерировать случайный вектор внутри гиперкуба, большего чем заданные границы. Далее вектор нормируется на $A$ и проверяется на выход за границы (уже свои $UB(i)$ и $LB(i)$), если выходит за границы, то генерируется другой вектор. Нижняя и верхняя границы каждого компонента генерируемого вектора определяются как $LB_z(i)=LB(i)-k(UB(i)-LB(i))$ и $UB_z(i)=UB(i)+k(UB(i)-LB(i))$ соответственно, где $k$-положительная константа. Чем больше $k$, тем ближе распределение к равномерному, тем медленнее сечет, поскольку чаще будет промах.
Способ, конечно, медленный, но в рамках реальной задачи скорость вполне приемлема - это вектор потом подается на вход функции, которая будет его мусолить секунды три.
Всем огромное спасибо за обсуждение!

 
 
 
 Re: генератор случайных чисел
Сообщение11.10.2011, 16:03 
Не очевидно, почему в вашем варианте будет равномерная распределенность на сечении гиперплоскостью...Вы бы все-таки, может, попробовали перейти к этой самой гиперплоскости и там проделать аналогичные манипуляции - заключить сечение в "гипер-плоский прямоугольник", после чего равномерно кидать в него точки, и отбирать те из них, которые попадают в заданную плоскую фигуру.
Например, для трехмерного случая можно в качестве подходящего ортогонального преобразования координат рассмотреть:
\begin{align*}
x_1 &= \frac{1}{\sqrt{6}}x_1' - \frac{1}{\sqrt{2}}x_2' + \frac{1}{\sqrt{3}}x_3'\\
x_2 &= \frac{1}{\sqrt{6}}x_1' + \frac{1}{\sqrt{2}}x_2' + \frac{1}{\sqrt{3}}x_3'\\
x_3 &= -\frac{2}{\sqrt{6}}x_1' + \frac{1}{\sqrt{3}}x_3'. 
\end{align*}
В штрихованной системе координат уравнение гиперплоскости принимает вид $x_3' = A/\sqrt{3}$. Соответственно, неравенства, задающие сечение параллелепипеда $[a_1,b_1]\times [a_2,b_2] \times [a_3,b_3]$ гиперплоскостью примут вид:
\begin{align*}
a_1 &\leq \frac{1}{\sqrt{6}}x_1'  -   \frac{1}{\sqrt{2}}x_2' +  \frac{1}{3}A \leq b_1\\
a_2 &\leq \frac{1}{\sqrt{6}}x_1'  +   \frac{1}{\sqrt{2}}x_2' +\frac{1}{3} A \leq b_2\\
a_3 &\leq -\frac{2}{\sqrt{6}}x_1' +  \frac{1}{3}A\leq b_2.
\end{align*}
Ну и все. Свели задачу к плоской. Достаточно теперь сгенерировать равномерно распределенные в этом сечении точки $ (x_1',x_2')$, например, тем же методом исключения (методом режекции)[заключив область в прямоугольник, и выбирая из равномерно набрасываемых в него точек те из них, которые попадают в нужную область], после чего вернуться к первоначальным координатам.

 
 
 [ Сообщений: 18 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group