how to create a list of random number with a minimum difference between each number?
11 次查看(过去 30 天)
显示 更早的评论
Hi,
I am trying to create a list of 'n' random numbers within a range(1,m) and the difference between adjacent numbers need to be at least 'd'.
The list needs to be sorted and no repetion allowed.
I can do the same in python using
% r = m - ((m - 1) * (n - 1))
% = 30 - ((3-1) * (6-1)) = 30 - 2*5 = 20
%[(d-1)*i + x for i, x in enumerate(sorted(random.sample(range(r), n)))]
print([2*i + x for i, x in enumerate(sorted(random.sample(range(20), 6)))])
>>[2, 5, 14, 20, 24, 28]
In the above code, I am trying to generate a sorted list of 6 random numbers from 0-30, with a minimum difference between each adjacent element of at least 3.
Can some one plese suggest me how can I do something similar in matlab?
11 个评论
Torsten
2022-8-2
So [2 14 4 28 20 4] (not ordered, repetitions allowed) (d=3, n=6 and m = 30) would be acceptable in your test case ?
回答(1 个)
David Hill
2022-8-2
编辑:David Hill
2022-8-2
You can brute force it.
m=200;%randomn numbers between 1-200
n=50;%array length
d=20;%minimum distance
a=randi(m,100000,n);%make sifficiently large
D=abs(diff(a,[],2));
idx=D>=d;
f=find(sum(idx,2)==n-1);
randNums=a(f,:);%rows of array having randomn numbers with adjacent elements being at least d apart
4 个评论
David Hill
2022-8-2
Below works but the randomn numbers will be skewed towards the high-side of the interval.
m=2000;
n=10;
d=5;
r=1:m;
R=[];
while 1
for k=1:n
if length(r)+k<n||isempty(r)
r=1:m;
R=[];
break;
end
p=randperm(length(r),1);
R=[R,r(p)];
r=r(r>(r(p)+d));
end
if ~isempty(R)
break;
end
end
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!