m = 100
n = 10
b = rand(1:m,n)
b = sort(b)
I want the minimum distance between adjacent values of b
to be >= 2.
How can I do that.
I have tried
b = rand(1:m,n)
while true
if length(Set(b)) == length(b)
b = sort(b)
c = diff(b)
if true == all(i -> i >= 2,c)
break
end
else
b = rand(1:m,n)
end
end
But this is taking a long time (almost infinite loop)
I have found out an answer by adapting python code to julia :
a = [2*i + x for (i, x) in enumerate(sort!(rand(1:m, n)))]
but these values are going above m.
Fundamentally there may not be n
numbers in the range 1:m
with minimum difference 2. And when m >> n it’s not clear precisely what distribution you want the numbers to come from.
That being said, a slightly better approach would be to generate the differences, perhaps from a geometric distribution:
using Distributions
p = 0.5
while true
b = cumsum(rand(Geometric(p), n) .+ 2)
last(b) <= m && break
end
Adjusting p
will give different distributions, and large p
and/or 2n close to m will result in the loop running longer.
1 Like
As screw_dog pointed out, this depends on what kind of randomness you want.
But if you simply want to keep the maximum value below m
, why not just use (1-k):(m-k*n)
instead of 1:m
?
k = 2
[k*i + x for (i, x) in enumerate(sort!(rand((1-k):(m-k*n), n)))]
2 Likes