MATLAB Answers

Choose n points randomly from a circle, how to calculate the probability that all the points are in one semicircle?

23 views (last 30 days)
elroi berkovits
elroi berkovits on 10 Jan 2020
Edited: elroi berkovits on 11 Jan 2020
I want to create a graphic monte carlo simulation that solves this problem, The mathematical answer is : n/2^(n-1)
maybe someone have the algorithm code for that question ?

  2 Comments

Guillaume
Guillaume on 10 Jan 2020
It's not entirely clear what you need help with. The problem itself is simple, so we don't know what's blocking you. You'd just run a monte-carlo simulation which is easy enough to implement.
The one difficultly I can see is the generation of points in a circular uniform distribution. You have to be careful not to use the naive approach of just picking uniform random radii and angles. However, less than 5 minutes of searching on the internet would give you simple and reliable algorithms for that, if it's not already built in matlab.
elroi berkovits
elroi berkovits on 10 Jan 2020
Can u try to help with the code?
i have this so far:
clear all
clc
clear
% Plot a circle.
angles = linspace(0, 2*pi, 720); % 720 is the total number of points
radius = 20;
xCenter = 50;
yCenter = 40;
x = radius * cos(angles) + xCenter;
y = radius * sin(angles) + yCenter;
% Plot circle.
plot(x, y, 'b-', 'LineWidth', 2);
% Plot center.
hold on;
plot(xCenter, yCenter, 'k+', 'LineWidth', 2, 'MarkerSize', 16);
grid on;
axis equal;
xlabel('X', 'FontSize', 16);
ylabel('Y', 'FontSize', 16);
% Now get random locations along the circle.
s1 = 2; % Number of random points to get.
n=1000; % Number of sim
xRandom = zeros(n,s1);
yRandom = zeros(n,s1);
for i=0:n-1
randomIndexes = randperm(length(angles), s1);
xRandom(i+1,:) = x(randomIndexes);
yRandom(i+1,:) = y(randomIndexes);
plot(xRandom, yRandom, 'ro', 'LineWidth', 2, 'MarkerSize', 16);
end
P = nnz(all(xRandom >=50,2))
R = nnz(all(xRandom <50,2))
PROB = (P+R)/n

Sign in to comment.

Answers (1)

KSSV
KSSV on 10 Jan 2020
% Generate circle
r = 1. ; % radius
th = linspace(0,2*pi) ;
x = r*cos(th) ;
y = r*sin(th) ;
% Geenrate random points inside the circle
N = 5000 ;
a = -1 ; b = 1 ;
xr = (b-a).*rand(N,1) + a;
yr = (b-a).*rand(N,1) + a;
% pick points lying inside the circle
idx1 = inpolygon(xr,yr,x,y) ;
xr = xr(idx1) ;
yr = yr(idx1) ;
% random points inside circle
NP1 = nnz(idx1) ;
% points lying in semicircle
idx2 = inpolygon(xr,yr,x(1:50),y(1:50)) ;
NP2 = nnz(idx2) ;
iwant = NP2/NP1 ; % probability that points lie in semicircle
plot(x,y)
hold on
plot(xr,yr,'.r')
plot(xr(idx2),yr(idx2),'ob')

  3 Comments

Guillaume
Guillaume on 10 Jan 2020
Considering that it's trivial to check if a point is inside a circle centered on the origin (sqrt(x.^2 + y.^2) <= radius) why approximate the circle to a polygon and rely on inpolygon for that?
elroi berkovits
elroi berkovits on 10 Jan 2020
It is very nice and efficient, but it does not answer the statistical question, for example at 3 points the probability is 0.75, at 4 points the probability is 0.5, at 5 points the probability is 0.3125, etc.
KSSV
KSSV on 10 Jan 2020
Yes you are right..I made the problem complex instead of using the inequality.
@elroi berkovits please noe that, you need not to use inpolygon. We have given you a idea, you should try the one you want.

Sign in to comment.

Sign in to answer this question.


Translated by