Julia 生成满足一定条件的固定数量的结果

Julia 生成满足一定条件的固定数量的结果,julia,generator,Julia,Generator,有没有一种方法可以重复调用函数,直到收集到具有特定属性的一定数量的结果 例子: 使用函数rand,我只想保留大于>=0.5的结果,并生成10个样本 当然,我可以使用Distributions包执行randTruncatedUniform0,1,0,0.5,10之类的操作,但我会搜索更抽象的解决方案 不太令人满意的解决方案: 到目前为止,我只发现了以下几点: using IterTools cond(x) = ... f() = ... gen = IterTools.repeatedly(f)

有没有一种方法可以重复调用函数,直到收集到具有特定属性的一定数量的结果

例子: 使用函数rand,我只想保留大于>=0.5的结果,并生成10个样本

当然,我可以使用Distributions包执行randTruncatedUniform0,1,0,0.5,10之类的操作,但我会搜索更抽象的解决方案

不太令人满意的解决方案: 到目前为止,我只发现了以下几点:

using IterTools
cond(x) = ...
f() = ...
gen = IterTools.repeatedly(f)
samples = collect(IterTools.take((n for n in gen if cond(n)), size))
对于上述示例:

using Distributions
using IterTools
cond(x) = x >= 0.5
f() = rand(Uniform(0,1))
gen = IterTools.repeatedly(f)
rnd_nodes = collect(IterTools.take((n for n in gen if cond(n)), 10))
但是有没有一种更简洁易懂的方法呢?

试试看

试一试

有没有一种方法可以重复调用函数,直到收集到具有特定属性的一定数量的结果

当然,使用一个简单的while循环

为了进行比较,我添加了0.5.*rand10.+0.5,它只提供您想要的,而不需要迭代和依赖运气

有没有一种方法可以重复调用函数,直到收集到具有特定属性的一定数量的结果

当然,使用一个简单的while循环

为了进行比较,我添加了0.5.*rand10.+0.5,它只提供您想要的,而不需要迭代和依赖运气

julia> using Transducers

julia> t = Map(_ -> rand()) |> Filter(x -> x >=0.5) |> Take(10)
Map(Main.λ❓) |>
    Filter(Main.λ❓) |>
    Take(10)

julia> collect(t, Iterators.repeated(1))
10-element Array{Float64,1}:
 0.6125615651973046
 0.9271858603504375
 0.8218768467739419
 0.5719380767545377
 0.7073831906599655
 0.5228490007486046
 0.9929437973392725
 0.6935716395158282
 0.6663379802812248
 0.6149007269488846
using BenchmarkTools, Transducers

function loop()
    res = Vector{Float64}(undef,10)
    i = 0
    while i<10
        r = rand()
        if r >= 0.5
            i+=1
            res[i] = r
        end
    end
    return res
end

function transducer() # @Jun Tian's answer
    t = Map(_ -> rand()) |> Filter(x -> x >=0.5) |> Take(10)
    return collect(t, Iterators.repeated(1))
end

@btime transducer(); # 687ns
@btime loop(); # 170ns
@btime 0.5 .* rand(10) .+ 0.5; # 86ns