Если я вас правильно понимаю, только точки в небольшом объеме n-мерного пространства соответствуют вашим ограничениям.
Ваше первое ограничение ограничивает его внутреннюю часть гиперсферы, что напоминает мне часто задаваемые вопросы о comp.graphics.algorithms «Однородные случайные точки на сфере» и Как генерировать равномерно распределенные точки в 3-мерном единичном шаре?
Второе ограничение немного выделяется из гиперсферы, а другие ограничения еще больше сокращают объем, соответствующий вашим ограничениям.
Я думаю, что самое простое, что можно сделать, это один из подходов, предложенных в FAQ:
- выберите произвольную ограничивающую рамку , выровненную по оси, которая , как мы уверены, содержит весь объем. В этом случае -c <a_1 <c, -c <a_2 <c, ... -c <a_n <c содержит весь ограниченный том, поскольку он содержит гиперсферу, описанную первым ограничением, а другие ограничения сохраняют единицы прочь в этом объеме.
- Алгоритм равномерно выбирает точки по всему ограничивающему прямоугольнику. В этом случае алгоритм независимо устанавливает каждую координату вектора-кандидата на некоторое независимое равномерно распределенное случайное число от -c до + c. (Я предполагаю, что вы хотите, чтобы точки распределялись с одинаковой плотностью по всему этому объему. Полагаю, вы могли бы заставить алгоритм выбрать некоторые или все координаты с распределением Пуассона или другим неравномерным распределением, если у вас была причина для этого).
- Если у вас есть вектор-кандидат, проверьте каждое ограничение. Если это не сработает, вернитесь и выберите другую точку.
- Если у вас есть вектор-кандидат, сохраните его где-нибудь для дальнейшего использования.
- Если у вас недостаточно сохраненных векторов, вернитесь и попробуйте сгенерировать еще один.
С достаточно качественным генератором случайных чисел это дает вам набор сохраненных координат, которые соответствуют вашим критериям с (ожидаемой) равномерной плотностью.
Увы, если у вас относительно высокая размерность n (т. Е. Если вы строите каждый вектор из относительно длинного списка координат), вписанная сфера (а тем более уменьшенный объем) имеет удивительно небольшую часть общего объема общая ограничивающая рамка, поэтому может потребоваться выполнить много итераций, большинство из которых генерируют отклоненные точки за пределами вашей ограниченной области, прежде чем найти точку внутри вашей ограниченной области. Поскольку компьютеры в наши дни довольно быстрые, будет ли это достаточно быстро?