在 Julia 的同心球体中取两个区间的数字

Take numbers form two intervals in concentric spheres in Julia

我正在尝试从 Julia 中的两个区间中获取数字。问题如下, 我正在尝试创建同心球体,我需要生成维度等于 15 的向量,其中填充了从每个圆圈中获取的数字。密码是:

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

for i=1:rmax-1
    ra[:,i].=rad/i
    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

在这里,我试图生成每个球体内部都有统一的随机数;在这种情况下,yt 只是球内数字构造的一部分。

我想在半径为 r0 的球体中生成点(在本例中为 ra[:,4]),然后点从第一个球体的边缘分布到第二个半径为 r1(这里是ra[:,3])等等。

为了做到这一点,我尝试采用满足两个条件之一的元素 -ra[(i+1)] < yt <= -ra[i] ra[(i+1)] <= yt < ra[i],即我想生成一个包含正数和负数的向量。我使用了运算符 || 但它似乎只占了积极的部分。我是 Julia 的新手,我不确定如何从间隔的两个部分中获取元素。有没有人知道如何去做?提前致谢

希望我理解正确。首先,我们需要能够从半径为 r0r1:

N 维 shell 中均匀采样
using Random
using LinearAlgebra: normalize

struct Shell{N}
    r0::Float64
    r1::Float64
end

Base.eltype(::Type{<:Shell}) = Vector{Float64}

function Random.rand(rng::Random.AbstractRNG, d::Random.SamplerTrivial{Shell{N}}) where {N}
    shell = d[]
    Δ = shell.r1 - shell.r0
    θ = normalize(randn(N))   # uniformly distributed N-dimensional direction of length 1
    r = shell.r0 .* θ  # scale to a point on the interior of the shell
    return r .+ Δ .* θ .* .√rand(N)  # add a uniformly random segment between r0 and r1
end

(有关挂接到 Random 的更多信息,请参阅 here。您同样可以实现一个新的 Distribution,但这并不是真正必要的。)

最重要的是,截断法线不会导致均匀分布,但也不会在正确的方向上添加均匀缩放:请参阅 here 了解为什么需要平方根(我希望我明白了没错;你应该再检查一次数学)。

然后我们可以创建一系列 shell 个具有嵌套半径的样本:

rmax = 5
rad = 10.0
ra = range(0, rad, length=rmax)

ptset = [rand(Shell{2}(ra[i], ra[i+1]), 15) for i = 1:(rmax - 1)]

(这部分我不太确定,但重点应该很清楚。)