Создайте равномерно случайную точку в кольце (кольцо) [дубликат]

Возможный дубликат:

Создать случайное число в кольце

Я хотел бы получить равномерно полученную случайную точку в пределахкольцото есть область, которая лежит внутри круга радиусаR1, но вне круга радиусаR2, гдеR1 > R2 и оба круга центрированы в одной точке. Я хотел бы избежать использования выборки отклонения.

Если возможно, я бы хотел, чтобы решение было похоже наэтот -используется для расчета случайных точек внутри круга который я считаю чрезвычайно элегантным и интуитивно понятным. То есть я также хотел бы избежать использованияквадратный корень.

 Ricardo Sanchez-Saez25 окт. 2012 г., 11:33
Спасибо за редактирование, не так лиЯ не знаю, что эта область была названа кольцом. ;-)
 Ricardo Sanchez-Saez25 окт. 2012 г., 19:25
Да, но если я действительно хотел получить конкретное решение, которое соответствует дополнительному ограничению, тогда ваше определение "точный дубликат не позволил бы мне получить один на StackOverflow. Во всяком случае, это уже решено, без разницы, закрыт он или открыт.
 Ricardo Sanchez-Saez25 окт. 2012 г., 12:35
Добавил уточнение, отметив, что я хотел бы избежать квадратного корня (следовательно, не совсем дубликат другого).
 Ricardo Sanchez-Saez25 окт. 2012 г., 16:46
Этот вопрос не является точным дубликатом. В отличие от другого вопроса, он просит (и я позже предоставил) решение, которое позволяет избежать использования квадратного корня.
 AakashM25 окт. 2012 г., 12:39
Я хочу, чтобы это был случай изменения[0,R] в вашем связанном вопросе к[R1,R2]но держу парине все так просто. Либо это?
 AakashM25 окт. 2012 г., 16:56
На мой взгляд, выоба решают одну и ту же проблему - этотолько тырешая это с дополнительным ограничением на то, чторазрешено

Ответы на вопрос(3)

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

НО ВНИМАНИЕ: вы можете сгенерировать тэта-значение с помощью равномерной случайной функции, что хорошо, но для расстояния вы не можете этого сделать, так как тогда точки будут группироваться вокруг начала координат. Вы должны принять во внимание, что периметр круга увеличивается в ^ 2 (вы должны использовать обратный, который является квадратным корнем).

Использование равномерно распределенной случайной функцииrnd (0..1) это было бы так:

theta = 360 * rnd();
dist = sqrt(rnd()*(R1^2-R2^2)+R2^2);

РЕДАКТИРОВАТЬ: Для преобразования в картезианские координаты вы просто вычисляете:

x =  dist * cos(theta);
y =  dist * sin(theta);
 flolo25 окт. 2012 г., 17:11
@rsanchezsaez: Вы неправильно указали формулу в коде, rnd () нужно умножать только на (R1 ^ 2-R2 ^ 2), но вы также умножаете + R2 ^ 2 на него.
 flolo25 окт. 2012 г., 11:17
Зависит от вас функция. Если вы используете не градусы, а радианы, просто замените 360 на 2 * PI
 Benjamin Bannier25 окт. 2012 г., 11:15
Я сомневаюсь что типичныйcos а такжеsin функции принимают градусы, скорее радианы. Но это рабочий метод.
 Ricardo Sanchez-Saez25 окт. 2012 г., 11:15
Если возможно, я бы хотел избежать sqrt (), как в ответе, который я связал. Я неЯ тоже не хочу использовать выборку отклонения.
 Ricardo Sanchez-Saez25 окт. 2012 г., 13:27
Извините, но новый не является кольцом, просто равномерная вероятность круга:i.imgur.com/ljBDd.png Для двух (надеюсь) правильных решений смотрите мой ответ, который я только что добавил. В любом случае, спасибо за попытку!
 Ricardo Sanchez-Saez25 окт. 2012 г., 19:18
@flolo: Вы правы! Извини за это. Вот это новая ничья:i.imgur.com/zxsqk.png Кроме того, я думаю, что это переформулировка этого предыдущего ответа:stackoverflow.com/a/9048443/269753
 flolo25 окт. 2012 г., 11:32
Ах, вы не упомянули, что вы не хотите sqrt. (В ссылке они имеют в качестве дополнительной стоимости еще одну оценку, которая обычно дороже, чем sqrt (когда он является хорошим генератором rnd) - это в основном то же самое, преобразование sqrt одной равномерной распределенной переменной в правую равномерное распределение, в то время как связанное решение суммирует два, чтобы получить неравномерное распределение).
 flolo25 окт. 2012 г., 12:47
Вы правы, Радиус должен быть в квадрате, я исправил это сейчас.
 Ricardo Sanchez-Saez25 окт. 2012 г., 12:32
Я построил ваше решение с помощью Mathematica, и оно нене выглядишь одинаково. Смотрите это здесь:i.imgur.com/8cc0I.png  Для решения, которое является однородным, см. Этот другой ответ:stackoverflow.com/a/9048443/269753 и нарисовано здесь:i.imgur.com/7L04w.png
Решение Вопроса

РЕДАКТИРОВАТЬ: Обратите внимание, что это решение может быть неоднородным. Смотрите комментарии Марка Дикинсона ниже.

Ладно, думаю, я понял это. Обратите внимание, что это решение в значительной степени вдохновленоэтот ответи что r1 = R1 / R1 и r2 = R2 / R1.

Псевдо-код:

t = 2*pi*random()
u = random()+random()
r = if u>1 then 2-u else u
r = if r 1, 2 - u, u];
r = If[r < r2, r2 + r*((R1 - R2)/R2), r];
{r Cos[t], r Sin[t]}]

ListPlot[Table[f[], {10000}], AspectRatio -> Automatic]

Что он делает, так это перераспределяет все числа, попадающие во внутренний круг, в кольцо, равномерно распределяя их. Если кто-то обнаружит проблему с единообразием этого решения, пожалуйста, прокомментируйте.

Сравните с этим другим найденным решениемВот:

 Ricardo Sanchez-Saez26 окт. 2012 г., 10:38
Марк, спасибо за ваш комментарий и за вашу альтернативу. Вы уверены, что мое решение неоднородно? Я могу'не замечайте этого даже при R2 = 0,95, как вы предложили:i.imgur.com/wmDEo.png
 Mark Dickinson25 окт. 2012 г., 19:54
Это аккуратный ответ, но, к сожалению, результат нет униформа. Если вы попробуете, например,R2 = 0.95 а такжеR1 = 1.0, вы'Вы увидите, что точки ближе к внешней стороне кольца предпочтительнее. Правильный способ создания подходящегоr это взять случайные величиныu а такжеv сu выбран равномерно в[R2, R1] а такжеv выбран равномерно в[0, R2 + R1], а затем принятьr = u еслиv < u а такжеr = R2 + R1 - u если .v >= u
 Mark Dickinson26 окт. 2012 г., 21:32
Да, конечно. :-) Вот's тест, который вы можете сделать: принятьR2=0.5 а такжеR1=1.0 и сгенерировать 10000 образцов (скажем). Теперь разделите ваше кольцевое пространство на два, добавив окружность с радиусом 0,75, и посчитайте, сколько образцов, которые вы создали, лежат во внешнем кольце (0,75 <= радиус <= 1,0) и сколько во внутреннем кольце (0,5 <= радиус <= 0,75). Если решение однородное, вы должны получить соотношение, близкое к 7/5 = 1,4 (площадь внешнего кольца = 7/16 пи; площадь внутреннего кольца = 5/16 пи). У меня нетпроверено, но ям, предсказывая, что ваше решение даст соотношение, близкое к 5/3 = 1,66666 ...

Самый простой способ сделать это - использоватьотбраковка выборки, Создайте большое количество точек равномерно в квадрате с длиной стороны 2 * R2, затем отфильтруйте эти образцы по тем, которые находятся внутри внешнего круга, а не во внутреннем круге.

Не красиво или эффективно, но в большинстве случаев достаточно.

 Benjamin Bannier25 окт. 2012 г., 11:06
Он сказал, что неЯ не хочу использовать выборку отклонения. И для выборки отклонения можно, по крайней мере, начать с точек, равномерных в большем круге, с помощью метода, с которым он связан.

Ваш ответ на вопрос