# Take numbers form two intervals in concentric circles

I am trying to take numbers from two intervals in Julia. The problem is the following, I am trying to create concentric circles and I need to generate vectors of dimension equal to 15 filled with numbers taken from each circle. The code is:

``````rmax = 5
ra = fill(0.0,1,rmax)

for i=1:rmax-1
ra[:,rmax].= 0
end
for i=1:3
ptset = Any[]
for j=1:200
yt= 0
yt= rand(Truncated(Normal(0, 1), -ra[i], ra[i] ))
if -ra[(i+1)] < yt <= -ra[i] || ra[(i+1)] <= yt < ra[i]
push!(ptset,yt)
if length(ptset) == 15
break
end
end

end
end
``````

Here I try to take elements that fulfill one of the two conditions

-ra[(i+1)] < yt <= -ra[i]

or

ra[(i+1)] <= yt < ra[i]

i.e. I would like to generate a vector with positive and negative numbers. I used the operator `||` but it seems to take only the positive part. I am new in Julia and I am not sure how to take the elements from both parts of the interval. Does anyone has a hit on how to do it?. Thanks in advance

I think something like this will work:

``````using LinearAlgebra # for norm()

function randshell(dimension, inner_radius::T, thickness::T) where {T<:AbstractFloat}
v = randn(dimension)
while norm(v) < 1e-3
v = randn(dimension)
end
r = thickness * rand(T)^(1/dimension) + inner_radius
return r * v / norm(v)
end
``````

Edit:
This is tricky to visualize, so I tried cutting out a corner of the sphere so you could see the shell. Works OK if you can interact with it.

``````using Plots
plotlyjs()

function plotit(N=10_000)
points = zeros(Float64, 3, N)
for i in 1:N
points[:, i] = randshell(3, 4.0, 2.0)
end
# cut out a corner so you can see the shell
# all points with all positive coordinates
cut_points = points[:, ((points[1, :] .> 0) .& (points[2, :] .> 0) .& (points[3, :] .> 0))]
scatter(cut_points[1, :], cut_points[2, :], cut_points[3, :], c=round.(Integer, (6 .+ cut_points[3, :])),
markersize=2, cmap="Spectral", aspect_ratio=:equal)
end
``````

Thank you for your nice reply and the code. Just a question, I understood that the code creates uniform points inside a sphere with radius `thikness`, and then it changes it adding `inner_radius`, but I think that I missed the concept, so when I try

[ra[i] for i =1:rmax]

4-element Array{Float64,1}:
0.0
0.28867513459481287
0.5773502691896257
0.8660254037844386

N=1
dimen=15
rmax = 4
I will obtain numbers for a sphere of radius `ra[j]` plus `ra`, is that correct?. I think is a silly question, but I am misunderstanding something in in the `randshell` function. Thanks in advance.