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