Как насчет - в псевдокоде Python значение R будет радиусом, а H - высотой:
s = random.uniform(0, 1)
theta = random.uniform(0, 2*pi)
z = random.uniform(0, H)
r = sqrt(s)*R
x = r * cos(theta)
y = r * sin(theta)
z = z # .. for symmetry :-)
Проблема с простым взятием x = r * cos(angle)
и y = r * sin(angle)
заключается в том, что тогда, когда r малото есть в центре круга незначительное изменение r не сильно меняет положения x и y.Таким образом, это приводит к неравномерному распределению в декартовых координатах, и точки концентрируются к центру круга.Получение квадратного корня исправляет это, по крайней мере, если я правильно сделал свою арифметику.
[Ах, похоже, что sqrt было правильным .]
(Примечаниея предположил, не думая об этом, что цилиндр выровнен с осью z, а центр цилиндра расположен в (0,0, H / 2). Было бы менее произвольно установить (0,0,0) вцентр цилиндра, и в этом случае z следует выбирать в диапазоне от -H / 2 до H / 2, а не 0, H.)