请问大家有遇到过Julia跑出来的结果不稳定,就是方差比较大的问题吗?比如我重复下面的100次试验,记录每次所用的时间,结果显示总有那么几次的时间是比平均值高出非常多,请问有大佬知道是什么原因吗?怎么才能降低方差呢?
n=10^6;
rlevel = [[0;1;2;3;4;5;6;7;8;9] .//10; [99//100, 999//1000]];
klevel = [[1; 10; 100; 500] .// 10^4; [1;2;3;4;5;6;7;8;9] .// 10]
res = zeros(100,2);
Random.seed!(n)
for i in 1:100
x0 = rand(Float64, n);
x0sort = sort(x0, rev=true);
k = Int64(ceil(n * klevel[1])) # 10
tks = sum(x0sort[1:k]);
r = tks * float(rlevel[1]); # 1
res[i,1] = @elapsed begin
tol::Float64 = 1e-8 # stopping criteria
uL::Float64 = -Inf
diffL::Float64 = vlengthL::Float64 = uR::Float64 = +Inf
l_fold = unew::Float64 = r/k;
uold = max_a::Float64 = maximum(x0);
Ite_init::Integer = 0;
sum_a_r1_old = 0.0;
m_old = 0;
l_fnew = 0.0;
flag = -2;
while true
r1 = x0 .> unew
m = sum(r1)
sum_a_r1 = sum(x0[r1])
l_fnew = (r - sum_a_r1 + m*unew)/k
if unew - l_fnew < tol
flag = 0;
break
end
if m == k
flag = -1;
break
end
if m > k
break
end
Ite_init += 1;
uold = unew;
l_fold = l_fnew
m_old = m;
sum_a_r1_old = sum_a_r1
unew = (uold*m - k*l_fold)/(m-k);
end
end
res[i, 2] = @elapsed begin
r3 = x0.>l_fold
compare_result = (r-k*l_fold) - (sum(x0[r3]) - sum(r3)*l_fold) + k*(uold - l_fold)
flag = -1;
end
end
mean(res, dims=1)
std(res, dims=1)