Random 朱莉娅:从不断缩小的范围内取样的最佳方法?
我想对Random 朱莉娅:从不断缩小的范围内取样的最佳方法?,random,julia,sample,sampling,Random,Julia,Sample,Sampling,我想对k数字进行采样,其中第一个数字从1:n中采样,第二个从1:n-1中采样,第三个从1:n-2中采样,依此类推 我有下面的实现 function shrinksample(n,k) [rand(1:m) for m in n:-1:n-k+1] end Julia中是否有更快的解决方案?以下内容借鉴了randperm的实现思想,并且由于n和k具有相同的顺序,这是适当的,因为需要相同类型的随机性(两者都有大小为n阶乘的输出空间): 技巧主要是使用内部的Base.Random.rand\
k
数字进行采样,其中第一个数字从1:n
中采样,第二个从1:n-1
中采样,第三个从1:n-2
中采样,依此类推
我有下面的实现
function shrinksample(n,k)
[rand(1:m) for m in n:-1:n-k+1]
end
Julia中是否有更快的解决方案?以下内容借鉴了
randperm
的实现思想,并且由于n
和k
具有相同的顺序,这是适当的,因为需要相同类型的随机性(两者都有大小为n
阶乘的输出空间):
技巧主要是使用内部的
Base.Random.rand\u lt
而不是常规的rand(1:n)
以下是从randperm
的实现中得到的想法,并且由于n
和k
具有相同的顺序,这是适当的,因为需要相同类型的随机性(两者的输出空间大小均为n
factorial):
技巧主要是使用内部
Base.Random.rand\u lt
而不是常规的rand(1:n)
如果这对随机性不太敏感(您没有进行加密),那么以下操作应该非常快且非常简单:
blazingshrinksample(n,k) = (Int)[trunc(Int,(n-m)rand()+1) for m in 0:k-1]
在您的实现和Dan的实现中进行测试,我得到了以下结果:
using BenchmarkTools
@btime shrinksample(10000,10000);
259.414 μs (2 allocations: 78.20 KiB)
@btime fastshrinksample(10000,10000);
66.713 μs (2 allocations: 78.20 KiB)
@btime blazingshrinksample(10000,10000);
33.614 μs (2 allocations: 78.20 KiB)
如果这对随机性不太敏感(您没有进行加密),那么以下操作应该非常快速和简单:
blazingshrinksample(n,k) = (Int)[trunc(Int,(n-m)rand()+1) for m in 0:k-1]
在您的实现和Dan的实现中进行测试,我得到了以下结果:
using BenchmarkTools
@btime shrinksample(10000,10000);
259.414 μs (2 allocations: 78.20 KiB)
@btime fastshrinksample(10000,10000);
66.713 μs (2 allocations: 78.20 KiB)
@btime blazingshrinksample(10000,10000);
33.614 μs (2 allocations: 78.20 KiB)
我不认为你的函数在做你所说的,但你所要求的仍然是更快的way@zombie修复了我的代码中的错误为什么不像你的问题所说的那样,只对1:k中的m使用
[rand(1:n-m)]
呢?n
和k
会是什么?与n
相比,k
会很小吗?您将采集多少样本?这些参数对于优化非常重要。@MichaelK.Borregaard[rand(1:n-m)for m in 0:k-1]
…我不认为您的函数正在执行您所说的操作,但仍然要求您执行更快的优化way@zombie修复了我的代码中的错误为什么不仅仅是[rand(1:n-m)表示1:k中的m]
正如你的问题所说的那样?n
和k
会是什么?与n
相比,k
会很小吗?你会采集多少样本?这些参数对于优化非常重要。@MichaelK.Borregaard[rand(1:n-m)表示0:k-1中的m]
…最好添加一个@assert
的k@assertn最好添加的@assert
k@assertN