朱莉娅 - 不同时间间隔的随机数

时间:2018-04-19 14:53:19

标签: random julia

您好

我想创建一个包含不同间隔数字的数组。

例如,使用以下代码:

using Distributions

A = rand(Uniform(1,10),1,20)

“A”包含1到10之间的20个数字。

我想创建“B”,其中“B”包含介于1和4之间,或介于6和10之间但不介于4和6之间的20个数字。

有可能吗?

谢谢

3 个答案:

答案 0 :(得分:3)

我认为对于一般用例,您希望确保您采样的新概率仍然是一个统一的概率,尽管分布在非连接范围内。

我将一个从多个断开的均匀分布产生新均匀分布的函数混合在一起:

using Distributions


function general_uniform(distributions...)

    all_dists = [distributions...]
    sort!(all_dists, by = D -> minimum(D))

    # make sure ranges are non overlapping
    @assert all(map(maximum, all_dists)[1:end-1] .<= map(minimum, all_dists)[2:end])

    dist_legths = map(D -> maximum(D) - minimum(D), all_dists)
    ratios = dist_legths ./ sum(dist_legths)

    return MixtureModel(all_dists, Categorical(ratios))
end

然后你可以像这样从中抽样:

B = rand(general_uniform(Uniform(1,4), Uniform(6,10)),1,20)

即使您的范围长度不同,也可以统一分发。例如:

general_uniform(Uniform(0,1), Uniform(1,10))

从0-1范围内采样概率为0.1,范围1-10采样概率为0.9。

例如,以下数字大约为5:

mean(rand(general_uniform(Uniform(0,9), Uniform(9,10)),1000))

答案 1 :(得分:2)

不确定

numbers = []
for i in 1 : 20
    if rand() < 0.5
        push!(numbers, rand(Uniform(1,4)))
    else
        push!(numbers, rand(Uniform(6,10)))
    end
end

您也可以混合使用: D = MixtureModel([Uniform(1,4), Uniform(6,10)], Categorical([0.5,0.5])) rand(D, 1, 20)

在这里,你必须指定一个概率分布,从中选择均匀分布,因此Categorical。上面的代码以相同的概率从每个均匀范围中采样。您可以根据需要更改分类来调整权重。

答案 2 :(得分:1)

使用两个均匀分布的混合模型

rand(MixtureModel(Uniform[Uniform(1,4),Uniform(6,10)]),1,20)

编辑::只有间隔的大小相等时,此采样才是正确的!

HTH!